Merge branch 'stable-2.14'

* stable-2.14:
  Remove redundant type definition
  Fix documentation
  Fix broken default configuration
  Remove buck build
  Stand-alone bazel build for events-log plugin
  Attach sources of byte-buddy and objenesis in eclipse
  Fix in-tree Eclipse project generation
  Remove dependency already packaged in gerrit-plugin-api
  Use double quotes in external_plugin_deps.bzl
  Format build file with buildifier

Test plan:

- bazel clean --expunge
- bazel build events-log
- bazel test --nocache_test_results //...
- Deploy plugin to gerrit master site
- Verify plugin loads without errors
- Do some change operations: create change, review, rebase, etc...
- Query REST endpoint
- Verify events for above operations are present

Just checking that a plugin builds is not enough to vote Verified

Change-Id: Ib735d186965fc645fddf242ed4c15a574e5d4444
diff --git a/.buckconfig b/.buckconfig
deleted file mode 100644
index 97c50e0..0000000
--- a/.buckconfig
+++ /dev/null
@@ -1,17 +0,0 @@
-[alias]
-  events-log = //:events-log
-  plugin = //:events-log
-  src = //:events-log-sources
-
-[java]
-  src_roots = java, resources
-  source_level = 8
-  target_level = 8
-
-[project]
-  ignore = .git, eclipse-out
-
-[cache]
-  mode = dir
-  dir = buck-out/cache
-
diff --git a/.gitignore b/.gitignore
index 50ce7fd..0da307d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,13 +2,8 @@
 .project
 .settings
 bin
-/.buckconfig.local
-/.buckd
-/buck-cache
-/buck-out
 /local.properties
 *.pyc
-.buckversion
-.watchmanconfig
-/bucklets
 /eclipse-out
+/.primary_build_tool
+/bazel-*
diff --git a/BUCK b/BUCK
deleted file mode 100644
index cfd0836..0000000
--- a/BUCK
+++ /dev/null
@@ -1,98 +0,0 @@
-include_defs('//bucklets/gerrit_plugin.bucklet')
-include_defs('//bucklets/java_sources.bucklet')
-include_defs('//bucklets/maven_jar.bucklet')
-
-SOURCES = glob(['src/main/java/**/*.java'])
-RESOURCES = glob(['src/main/resources/**/*'])
-DEPS = [
-  '//lib:gson',
-  '//lib/commons:dbcp',
-]
-TEST_DEPS = GERRIT_PLUGIN_API + DEPS + GERRIT_TESTS + [
-  ':events-log__plugin',
-  ':mockito',
-# bazlets include those 3 bouncycastle jars in plugin API so this is temporary
-# until this plugin is built with bazel.
-# see https://gerrit-review.googlesource.com/#/c/102670/ for more info.
-  ':bouncycastle_bcprov',
-  ':bouncycastle_bcpg',
-  ':bouncycastle_bcpkix',
-]
-
-gerrit_plugin(
-  name = 'events-log',
-  srcs = SOURCES,
-  resources = RESOURCES,
-  manifest_entries = [
-    'Gerrit-PluginName: events-log',
-    'Implementation-Vendor: Ericsson',
-    'Implementation-URL: https://gerrit-review.googlesource.com/#/admin/projects/plugins/events-log',
-    'Gerrit-Module: com.ericsson.gerrit.plugins.eventslog.sql.SQLModule',
-    'Gerrit-HttpModule: com.ericsson.gerrit.plugins.eventslog.HttpModule',
-  ],
-  provided_deps = DEPS,
-)
-
-java_library(
-  name = 'classpath',
-  deps = TEST_DEPS,
-)
-
-java_test(
-  name = 'events-log_tests',
-  srcs = glob(['src/test/java/**/*.java']),
-  labels = ['events-log'],
-  deps = TEST_DEPS,
-)
-
-java_sources(
-  name = 'events-log-sources',
-  srcs = SOURCES + RESOURCES,
-)
-
-maven_jar(
-  name = 'mockito',
-  id = 'org.mockito:mockito-core:2.5.0',
-  sha1 = 'be28d46a52c7f2563580adeca350145e9ce916f8',
-  license = 'MIT',
-  deps = [
-    ':byte-buddy',
-    ':objenesis',
-  ],
-)
-
-maven_jar(
-  name = 'byte-buddy',
-  id = 'net.bytebuddy:byte-buddy:1.5.12',
-  sha1 = 'b1ba1d15f102b36ed43b826488114678d6d413da',
-  license = 'DO_NOT_DISTRIBUTE',
-  attach_source = False,
-)
-
-maven_jar(
-  name = 'objenesis',
-  id = 'org.objenesis:objenesis:2.4',
-  sha1 = '2916b6c96b50c5b3ec4452ed99401db745aabb27',
-  license = 'DO_NOT_DISTRIBUTE',
-  attach_source = False,
-)
-
-BC_VERS = '1.56'
-
-maven_jar(
-  name = 'bouncycastle_bcprov',
-  id = 'org.bouncycastle:bcprov-jdk15on:' + BC_VERS,
-  sha1 = 'a153c6f9744a3e9dd6feab5e210e1c9861362ec7',
-)
-
-maven_jar(
-  name = 'bouncycastle_bcpg',
-  id = 'org.bouncycastle:bcpg-jdk15on:' + BC_VERS,
-  sha1 = '9c3f2e7072c8cc1152079b5c25291a9f462631f1',
-)
-
-maven_jar(
-  name = 'bouncycastle_bcpkix',
-  id = 'org.bouncycastle:bcpkix-jdk15on:' + BC_VERS,
-  sha1 = '4648af70268b6fdb24674fb1fd7c1fcc73db1231',
-)
diff --git a/BUILD b/BUILD
index 8ac7c99..da14708 100644
--- a/BUILD
+++ b/BUILD
@@ -9,34 +9,32 @@
 gerrit_plugin(
     name = "events-log",
     srcs = glob(["src/main/java/**/*.java"]),
-    resources = glob(["src/main/resources/**/*"]),
     manifest_entries = [
         "Gerrit-PluginName: events-log",
         "Implementation-URL: https://gerrit-review.googlesource.com/#/admin/projects/plugins/events-log",
+        "Implementation-Title: events-log plugin",
         "Gerrit-Module: com.ericsson.gerrit.plugins.eventslog.sql.SQLModule",
         "Gerrit-HttpModule: com.ericsson.gerrit.plugins.eventslog.HttpModule",
     ],
+    resources = glob(["src/main/resources/**/*"]),
+)
+
+junit_tests(
+    name = "events_log_tests",
+    testonly = 1,
+    srcs = glob(["src/test/java/**/*.java"]),
+    tags = ["events-log"],
     deps = [
-        "@gson//jar:neverlink",
-        "@commons_dbcp//jar:neverlink",
+        ":events-log__plugin_test_deps",
     ],
 )
 
 java_library(
     name = "events-log__plugin_test_deps",
+    testonly = 1,
     visibility = ["//visibility:public"],
-    exports = [
+    exports = PLUGIN_DEPS + PLUGIN_TEST_DEPS + [
+        ":events-log__plugin",
         "@mockito//jar",
     ],
 )
-
-junit_tests(
-    name = "events_log_tests",
-    srcs = glob(["src/test/java/**/*.java"]),
-    tags = ["events-log"],
-    deps = PLUGIN_DEPS + PLUGIN_TEST_DEPS + [
-        ":events-log__plugin",
-        ":events-log__plugin_test_deps",
-    ],
-    testonly = 1,
-)
diff --git a/WORKSPACE b/WORKSPACE
new file mode 100644
index 0000000..91147b7
--- /dev/null
+++ b/WORKSPACE
@@ -0,0 +1,30 @@
+workspace(name = "events_log")
+
+load("//:bazlets.bzl", "load_bazlets")
+
+load_bazlets(
+    commit = "b7514d03a7798905ff1513295b46620e57b8f386",
+    #    local_path = "/home/<user>/projects/bazlets",
+)
+
+#Snapshot Plugin API
+load(
+    "@com_googlesource_gerrit_bazlets//:gerrit_api_maven_local.bzl",
+    "gerrit_api_maven_local",
+)
+
+# Load snapshot Plugin API
+gerrit_api_maven_local()
+
+# Release Plugin API
+#load(
+#    "@com_googlesource_gerrit_bazlets//:gerrit_api.bzl",
+#    "gerrit_api",
+#)
+
+# Load release Plugin API
+#gerrit_api()
+
+load("//:external_plugin_deps.bzl", "external_plugin_deps")
+
+external_plugin_deps()
diff --git a/bazlets.bzl b/bazlets.bzl
new file mode 100644
index 0000000..e14e488
--- /dev/null
+++ b/bazlets.bzl
@@ -0,0 +1,17 @@
+NAME = "com_googlesource_gerrit_bazlets"
+
+def load_bazlets(
+    commit,
+    local_path = None
+  ):
+  if not local_path:
+      native.git_repository(
+          name = NAME,
+          remote = "https://gerrit.googlesource.com/bazlets",
+          commit = commit,
+      )
+  else:
+      native.local_repository(
+          name = NAME,
+          path = local_path,
+      )
diff --git a/external_plugin_deps.bzl b/external_plugin_deps.bzl
index 53284f7..135e5f6 100644
--- a/external_plugin_deps.bzl
+++ b/external_plugin_deps.bzl
@@ -2,25 +2,23 @@
 
 def external_plugin_deps():
   maven_jar(
-    name = 'mockito',
-    artifact = 'org.mockito:mockito-core:2.5.0',
-    sha1 = 'be28d46a52c7f2563580adeca350145e9ce916f8',
+    name = "mockito",
+    artifact = "org.mockito:mockito-core:2.5.0",
+    sha1 = "be28d46a52c7f2563580adeca350145e9ce916f8",
     deps = [
-      '@byte_buddy//jar',
-      '@objenesis//jar',
+      "@byte_buddy//jar",
+      "@objenesis//jar",
     ],
   )
 
   maven_jar(
-    name = 'byte_buddy',
-    artifact = 'net.bytebuddy:byte-buddy:1.5.12',
-    sha1 = 'b1ba1d15f102b36ed43b826488114678d6d413da',
-    attach_source = False,
+    name = "byte_buddy",
+    artifact = "net.bytebuddy:byte-buddy:1.5.12",
+    sha1 = "b1ba1d15f102b36ed43b826488114678d6d413da",
   )
 
   maven_jar(
-    name = 'objenesis',
-    artifact = 'org.objenesis:objenesis:2.4',
-    sha1 = '2916b6c96b50c5b3ec4452ed99401db745aabb27',
-    attach_source = False,
+    name = "objenesis",
+    artifact = "org.objenesis:objenesis:2.4",
+    sha1 = "2916b6c96b50c5b3ec4452ed99401db745aabb27",
   )
diff --git a/lib/BUCK b/lib/BUCK
deleted file mode 100644
index 06f7c02..0000000
--- a/lib/BUCK
+++ /dev/null
@@ -1,8 +0,0 @@
-include_defs('//bucklets/maven_jar.bucklet')
-
-maven_jar(
-  name = 'gson',
-  id = 'com.google.code.gson:gson:2.3.1',
-  sha1 = 'ecb6e1f8e4b0e84c4b886c2f14a1500caf309757',
-  license = 'Apache2.0',
-)
diff --git a/lib/commons/BUCK b/lib/commons/BUCK
deleted file mode 100644
index ee87715..0000000
--- a/lib/commons/BUCK
+++ /dev/null
@@ -1,23 +0,0 @@
-include_defs('//bucklets/maven_jar.bucklet')
-
-maven_jar(
-  name = 'dbcp',
-  id = 'commons-dbcp:commons-dbcp:1.4',
-  sha1 = '30be73c965cc990b153a100aaaaafcf239f82d39',
-  license = 'Apache2.0',
-  deps = [':pool'],
-  exclude = [
-    'META-INF/LICENSE.txt',
-    'META-INF/NOTICE.txt',
-    'testpool.jocl'
-  ],
-)
-
-maven_jar(
-  name = 'pool',
-  id = 'commons-pool:commons-pool:1.5.5',
-  sha1 = '7d8ffbdc47aa0c5a8afe5dc2aaf512f369f1d19b',
-  license = 'Apache2.0',
-  attach_source = False,
-  exclude = ['META-INF/LICENSE.txt', 'META-INF/NOTICE.txt'],
-)
diff --git a/lib/gerrit/BUCK b/lib/gerrit/BUCK
deleted file mode 100644
index 8d5f0e9..0000000
--- a/lib/gerrit/BUCK
+++ /dev/null
@@ -1,20 +0,0 @@
-include_defs('//bucklets/maven_jar.bucklet')
-
-VER = '2.14-SNAPSHOT'
-REPO = MAVEN_LOCAL
-
-maven_jar(
-  name = 'acceptance-framework',
-  id = 'com.google.gerrit:gerrit-acceptance-framework:' + VER,
-  license = 'Apache2.0',
-  attach_source = False,
-  repository = REPO,
-)
-
-maven_jar(
-  name = 'plugin-api',
-  id = 'com.google.gerrit:gerrit-plugin-api:' + VER,
-  license = 'Apache2.0',
-  attach_source = False,
-  repository = REPO,
-)
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventsLogConfig.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventsLogConfig.java
index 997f86d..6105be6 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventsLogConfig.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventsLogConfig.java
@@ -49,7 +49,6 @@
   static final int DEFAULT_WAIT_TIME = 1000;
   static final int DEFAULT_CONN_TIME = 1000;
   static final String DEFAULT_DRIVER = "org.h2.Driver";
-  static final String DEFAULT_URL = "jdbc:h2:~/db/";
   static final int DEFAULT_EVICT_IDLE_TIME = 1000 * 60;
 
   private boolean copyLocal;
@@ -65,6 +64,7 @@
   private String storeUsername;
   private String storePassword;
   private int evictIdleTime;
+  private String defaultUrl;
 
   @Inject
   EventsLogConfig(PluginConfigFactory cfgFactory,
@@ -79,7 +79,8 @@
     waitTime = cfg.getInt(CONFIG_WAIT_TIME, DEFAULT_WAIT_TIME);
     connectTime = cfg.getInt(CONFIG_CONN_TIME, DEFAULT_CONN_TIME);
     storeDriver = cfg.getString(CONFIG_DRIVER, DEFAULT_DRIVER);
-    storeUrl = cfg.getString(CONFIG_URL, DEFAULT_URL);
+    defaultUrl = "jdbc:h2:" + site.data_dir.toString() + "/db";
+    storeUrl = cfg.getString(CONFIG_URL, defaultUrl);
     localStorePath = Paths.get(cfg.getString(CONFIG_LOCAL_PATH,
         defaultLocalPath));
     urlOptions = concatenate(cfg.getStringList(CONFIG_URL_OPTIONS));
diff --git a/src/main/resources/Documentation/build.md b/src/main/resources/Documentation/build.md
index 6c1ba49..41a69ca 100644
--- a/src/main/resources/Documentation/build.md
+++ b/src/main/resources/Documentation/build.md
@@ -1,7 +1,45 @@
 Build
 =====
 
-This plugin is built with Bazel.
+This plugin is built with Bazel. Two build modes are supported:
+ * Standalone
+ * In Gerrit tree.
+
+Standalone build mode is recommended, as this mode doesn't require local Gerrit
+tree to exist. Moreover, there are some limitations and additional manual steps
+required when building in Gerrit tree mode (see corresponding sections).
+
+## Build standalone
+
+### Bazel
+
+To build the plugin, issue the following command:
+
+```
+  bazel build @PLUGIN@
+```
+
+The output is created in
+
+```
+  bazel-genfiles/@PLUGIN@.jar
+```
+
+To execute the tests run:
+
+```
+  bazel test //...
+```
+
+This project can be imported into the Eclipse IDE:
+
+```
+  ./tools/eclipse/project.sh
+```
+
+## Build in Gerrit tree
+
+### Bazel
 
 Clone (or link) this plugin to the `plugins` directory of Gerrit's source tree.
 
@@ -29,8 +67,9 @@
 ```
 
 This project can be imported into the Eclipse IDE.
-Add the plugin name to the `CUSTOM_PLUGINS` set in
-Gerrit core in `tools/bzl/plugins.bzl`, and execute:
+Add the plugin name to the `CUSTOM_PLUGINS` and to the
+`CUSTOM_PLUGINS_TEST_DEPS` set in Gerrit core in
+`tools/bzl/plugins.bzl`, and execute:
 
 ```
   ./tools/eclipse/project.py
diff --git a/src/main/resources/Documentation/config.md b/src/main/resources/Documentation/config.md
index 749c600..4e29811 100644
--- a/src/main/resources/Documentation/config.md
+++ b/src/main/resources/Documentation/config.md
@@ -8,7 +8,7 @@
   [plugin "@PLUGIN@"]
     maxAge = 20
     returnLimit = 10000
-    storeUrl = jdbc:h2:~/gerrit/db/
+    storeUrl = jdbc:h2:<gerrit_site>/data/db
     urlOptions = loglevel=INFO
     urlOptions = logUnclosedConnections=true
     copyLocal = true
@@ -29,11 +29,11 @@
 
 plugin.@PLUGIN@.storeUrl
 :    Specify the path to the directory in which to keep the database. When not
-     specified, the default path is jdbc:h2:~/db/.
+     specified, the default path is jdbc:h2:\<gerrit_site>/data/db.
 
 plugin.@PLUGIN@.localStorePath
 :    Specify the path to the directory in which to keep the back up database.
-     When not specified, the default path is <gerrit_site>/events-db/.
+     When not specified, the default path is \<gerrit_site>/events-db/.
 
 plugin.@PLUGIN@.storeUsername
 :    Username to connect to the database, not defined by default. This value can
diff --git a/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventHandlerTest.java b/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventHandlerTest.java
index 2a82b5a..af1cfa8 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventHandlerTest.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventHandlerTest.java
@@ -29,6 +29,7 @@
 import org.mockito.junit.MockitoJUnitRunner;
 
 import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
 
 @RunWith(MockitoJUnitRunner.class)
 public class EventHandlerTest {
@@ -56,7 +57,7 @@
     verifyZeroInteractions(storeMock);
   }
 
-  class PoolMock extends ScheduledExecutorService {
+  class PoolMock extends ScheduledThreadPoolExecutor {
     PoolMock() {
       super(1);
     }
diff --git a/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventsLogConfigTest.java b/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventsLogConfigTest.java
index a767793..f1f6a07 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventsLogConfigTest.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventsLogConfigTest.java
@@ -34,7 +34,6 @@
 import static com.ericsson.gerrit.plugins.eventslog.EventsLogConfig.DEFAULT_MAX_AGE;
 import static com.ericsson.gerrit.plugins.eventslog.EventsLogConfig.DEFAULT_MAX_TRIES;
 import static com.ericsson.gerrit.plugins.eventslog.EventsLogConfig.DEFAULT_RETURN_LIMIT;
-import static com.ericsson.gerrit.plugins.eventslog.EventsLogConfig.DEFAULT_URL;
 import static com.ericsson.gerrit.plugins.eventslog.EventsLogConfig.DEFAULT_WAIT_TIME;
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Mockito.when;
@@ -63,6 +62,7 @@
   private SitePaths site;
   private EventsLogConfig config;
   private String defaultLocalStorePath;
+  private String defaultUrl;
   private String localStorePath;
   private String[] urlOptions = new String[] {"DB_CLOSE_DELAY=10"};
 
@@ -79,6 +79,7 @@
     site = new SitePaths(gerrit_site.getRoot().toPath());
     Files.createDirectories(site.etc_dir);
     defaultLocalStorePath = site.site_path.toString() + "/events-db/";
+    defaultUrl = "jdbc:h2:" + site.data_dir.toString() + "/db";
     when(cfgFactoryMock.getFromGerritConfig(PLUGIN_NAME, true))
         .thenReturn(configMock);
   }
@@ -98,7 +99,7 @@
         .thenReturn(DEFAULT_WAIT_TIME);
     when(configMock.getString(CONFIG_DRIVER, DEFAULT_DRIVER))
         .thenReturn(DEFAULT_DRIVER);
-    when(configMock.getString(CONFIG_URL, DEFAULT_URL)).thenReturn(DEFAULT_URL);
+    when(configMock.getString(CONFIG_URL, defaultUrl)).thenReturn(defaultUrl);
     when(configMock.getString(CONFIG_LOCAL_PATH, defaultLocalStorePath))
         .thenReturn(defaultLocalStorePath);
     when(configMock.getStringList(CONFIG_URL_OPTIONS))
@@ -123,7 +124,7 @@
         .thenReturn(5000);
     when(configMock.getString(CONFIG_DRIVER, DEFAULT_DRIVER))
         .thenReturn("org.h2.Driver2");
-    when(configMock.getString(CONFIG_URL, DEFAULT_URL))
+    when(configMock.getString(CONFIG_URL, defaultUrl))
         .thenReturn("jdbc:h2:~/gerrit/db");
     when(configMock.getString(CONFIG_LOCAL_PATH, defaultLocalStorePath))
         .thenReturn(localStorePath);
@@ -149,7 +150,7 @@
     assertThat(config.getLocalStorePath().toString() + "/")
         .isEqualTo(defaultLocalStorePath);
     assertThat(config.getStoreDriver()).isEqualTo(DEFAULT_DRIVER);
-    assertThat(config.getStoreUrl()).isEqualTo(DEFAULT_URL);
+    assertThat(config.getStoreUrl()).isEqualTo(defaultUrl);
     assertThat(config.getUrlOptions()).isEmpty();
     assertThat(config.getStoreUsername()).isNull();
     assertThat(config.getStorePassword()).isNull();
diff --git a/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventsRestApiServletTest.java b/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventsRestApiServletTest.java
index 1dcb53a..e06f199 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventsRestApiServletTest.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventsRestApiServletTest.java
@@ -76,7 +76,7 @@
     when(queryMakerMock.formQueryFromRequestParameters(captor.capture()))
         .thenReturn(RANDOM_QUERY);
     when(storeMock.queryChangeEvents(RANDOM_QUERY))
-        .thenReturn(new ArrayList<String>());
+        .thenReturn(new ArrayList<>());
     eventServlet.doGet(reqMock, rspMock);
     assertThat(ImmutableMap.of("a", "1", "b", "2"))
         .isEqualTo(captor.getValue());
@@ -88,7 +88,7 @@
     when(queryMakerMock.formQueryFromRequestParameters(captor.capture()))
         .thenReturn(RANDOM_QUERY);
     when(storeMock.queryChangeEvents(RANDOM_QUERY))
-        .thenReturn(new ArrayList<String>());
+        .thenReturn(new ArrayList<>());
     eventServlet.doGet(reqMock, rspMock);
     assertThat(captor.getValue()).isEmpty();
   }
diff --git a/src/test/java/com/ericsson/gerrit/plugins/eventslog/sql/QueryMakerTest.java b/src/test/java/com/ericsson/gerrit/plugins/eventslog/sql/QueryMakerTest.java
index 4094b23..fd735be 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/eventslog/sql/QueryMakerTest.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/eventslog/sql/QueryMakerTest.java
@@ -80,7 +80,7 @@
   @Test(expected = MalformedQueryException.class)
   public void noDate() throws Exception {
     queryMaker
-        .formQueryFromRequestParameters(ImmutableMap.<String, String> of());
+        .formQueryFromRequestParameters(ImmutableMap.of());
   }
 
   @Test
diff --git a/src/test/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLStoreTest.java b/src/test/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLStoreTest.java
index f429e39..8a95c9a 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLStoreTest.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLStoreTest.java
@@ -17,6 +17,7 @@
 import static com.ericsson.gerrit.plugins.eventslog.sql.SQLTable.TABLE_NAME;
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
@@ -25,11 +26,11 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.Project.NameKey;
 import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.events.ProjectEvent;
-import com.google.gerrit.server.project.NoSuchProjectException;
-import com.google.gerrit.server.project.ProjectControl;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.ProjectPermission;
 import com.google.gson.Gson;
 import com.google.inject.Provider;
 
@@ -47,7 +48,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.IOException;
 import java.net.ConnectException;
 import java.sql.Connection;
 import java.sql.DriverManager;
@@ -57,6 +57,7 @@
 import java.util.Arrays;
 import java.util.List;
 import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 
@@ -71,21 +72,24 @@
   private static final String TERM_CONN_MSG = "terminating connection";
   private static final String MSG = "message";
   private static final String GENERIC_QUERY = "SELECT * FROM " + TABLE_NAME;
-  private static final boolean PROJECT_VISIBLE_TO_USER = true;
-  private static final boolean PROJECT_NOT_VISIBLE_TO_USER = false;
 
   @Mock
-  private ProjectControl.GenericFactory pcFactoryMock;
-  @Mock
   private Provider<CurrentUser> userProviderMock;
   @Mock
   private EventsLogConfig cfgMock;
+  @Mock
+  private PermissionBackend permissionBackendMock;
+  @Mock
+  private PermissionBackend.ForProject forProjectMock;
+  @Mock
+  private PermissionBackend.WithUser withUserMock;
+
   private SQLClient eventsDb;
   private SQLClient localEventsDb;
   private SQLStore store;
   private ScheduledExecutorService poolMock;
-
   private Statement stat;
+  private MockEvent mockEvent;
 
   @Rule
   public TemporaryFolder testFolder = new TemporaryFolder();
@@ -94,6 +98,7 @@
   public void setUp() throws SQLException {
     Connection conn =
         DriverManager.getConnection(TEST_URL + ";" + TEST_OPTIONS);
+    mockEvent = new MockEvent();
     stat = conn.createStatement();
     poolMock = new PoolMock();
     when(cfgMock.getMaxAge()).thenReturn(5);
@@ -105,23 +110,13 @@
     store.stop();
   }
 
-  private void setUpClient() {
-    eventsDb = new SQLClient(TEST_DRIVER, TEST_URL, TEST_OPTIONS);
-    localEventsDb = new SQLClient(TEST_DRIVER, TEST_LOCAL_URL, TEST_OPTIONS);
-    store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
-        localEventsDb, poolMock);
-    store.start();
-  }
-
-  private void setUpClientMock() throws SQLException {
-    eventsDb = mock(SQLClient.class);
-    localEventsDb = mock(SQLClient.class);
-    when(localEventsDb.dbExists()).thenReturn(true);
-  }
-
   @Test
   public void storeThenQueryVisible() throws Exception {
-    MockEvent mockEvent = setUpMocks(PROJECT_VISIBLE_TO_USER);
+    when(permissionBackendMock.user(userProviderMock)).thenReturn(withUserMock);
+    when(withUserMock.project(any(Project.NameKey.class)))
+        .thenReturn(forProjectMock);
+    doNothing().when(forProjectMock).check(ProjectPermission.ACCESS);
+    setUpClient();
     store.storeEvent(mockEvent);
     List<String> events = store.queryChangeEvents(GENERIC_QUERY);
     String json = new Gson().toJson(mockEvent);
@@ -131,26 +126,18 @@
 
   @Test
   public void storeThenQueryNotVisible() throws Exception {
-    MockEvent mockEvent = setUpMocks(PROJECT_NOT_VISIBLE_TO_USER);
+    when(permissionBackendMock.user(userProviderMock)).thenReturn(withUserMock);
+    when(withUserMock.project(any(Project.NameKey.class)))
+        .thenReturn(forProjectMock);
+    doThrow(new PermissionBackendException("")).when(forProjectMock)
+        .check(ProjectPermission.ACCESS);
+    setUpClient();
     store.storeEvent(mockEvent);
     List<String> events = store.queryChangeEvents(GENERIC_QUERY);
     assertThat(events).isEmpty();
     tearDown();
   }
 
-  private MockEvent setUpMocks(boolean isVisible)
-      throws NoSuchProjectException, IOException {
-    MockEvent mockEvent = new MockEvent();
-    ProjectControl pcMock = mock(ProjectControl.class);
-    CurrentUser userMock = mock(CurrentUser.class);
-    when(userProviderMock.get()).thenReturn(userMock);
-    when(pcFactoryMock.controlFor(mockEvent.getProjectNameKey(), userMock))
-        .thenReturn(pcMock);
-    when(pcMock.isVisible()).thenReturn(isVisible);
-    setUpClient();
-    return mockEvent;
-  }
-
   @Test(expected = MalformedQueryException.class)
   public void throwBadRequestTriggerOnBadQuery() throws Exception {
     setUpClient();
@@ -159,29 +146,12 @@
   }
 
   @Test
-  public void notReturnEventOfNonExistingProject() throws Exception {
-    MockEvent mockEvent = new MockEvent();
-    Project.NameKey projectMock = mock(Project.NameKey.class);
-    CurrentUser userMock = mock(CurrentUser.class);
-    when(userProviderMock.get()).thenReturn(userMock);
-    NameKey projectNameKey = mockEvent.getProjectNameKey();
-    doThrow(new NoSuchProjectException(projectMock)).when(pcFactoryMock)
-        .controlFor(projectNameKey, userMock);
-    setUpClient();
-    store.storeEvent(mockEvent);
-    List<String> events = store.queryChangeEvents(GENERIC_QUERY);
-    assertThat(events).isEmpty();
-    tearDown();
-  }
-
-  @Test
   public void notReturnEventWithNoVisibilityInfo() throws Exception {
-    MockEvent mockEvent = new MockEvent();
-    CurrentUser userMock = mock(CurrentUser.class);
-    when(userProviderMock.get()).thenReturn(userMock);
-    NameKey projectNameKey = mockEvent.getProjectNameKey();
-    doThrow(new IOException()).when(pcFactoryMock).controlFor(projectNameKey,
-        userMock);
+    when(permissionBackendMock.user(userProviderMock)).thenReturn(withUserMock);
+    when(withUserMock.project(any(Project.NameKey.class)))
+        .thenReturn(forProjectMock);
+    doThrow(new PermissionBackendException("")).when(forProjectMock)
+        .check(ProjectPermission.ACCESS);
     setUpClient();
     store.storeEvent(mockEvent);
     List<String> events = store.queryChangeEvents(GENERIC_QUERY);
@@ -191,15 +161,14 @@
 
   @Test
   public void retryOnConnectException() throws Exception {
-    MockEvent mockEvent = new MockEvent();
     when(cfgMock.getMaxTries()).thenReturn(3);
     Throwable[] exceptions = new Throwable[3];
     Arrays.fill(exceptions, new SQLException(new ConnectException()));
     setUpClientMock();
     doThrow(exceptions).doNothing().when(eventsDb).storeEvent(mockEvent);
     doThrow(exceptions).doNothing().when(eventsDb).queryOne();
-    store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
-        localEventsDb, poolMock);
+    store = new SQLStore(userProviderMock, cfgMock, eventsDb,
+        localEventsDb, poolMock, permissionBackendMock);
     store.start();
     store.storeEvent(mockEvent);
     verify(eventsDb, times(3)).storeEvent(mockEvent);
@@ -208,15 +177,14 @@
 
   @Test
   public void retryOnMessage() throws Exception {
-    MockEvent mockEvent = new MockEvent();
     when(cfgMock.getMaxTries()).thenReturn(3);
     Throwable[] exceptions = new Throwable[3];
     Arrays.fill(exceptions, new SQLException(TERM_CONN_MSG));
     setUpClientMock();
     doThrow(exceptions).doNothing().when(eventsDb).storeEvent(mockEvent);
     doThrow(exceptions).doNothing().when(eventsDb).queryOne();
-    store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
-        localEventsDb, poolMock);
+    store = new SQLStore(userProviderMock, cfgMock, eventsDb,
+        localEventsDb, poolMock, permissionBackendMock);
     store.start();
     store.storeEvent(mockEvent);
     verify(eventsDb, times(3)).storeEvent(mockEvent);
@@ -225,12 +193,11 @@
 
   @Test
   public void noRetryOnMessage() throws Exception {
-    MockEvent mockEvent = new MockEvent();
     when(cfgMock.getMaxTries()).thenReturn(3);
     setUpClientMock();
     doThrow(new SQLException(MSG)).when(eventsDb).storeEvent(mockEvent);
-    store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
-        localEventsDb, poolMock);
+    store = new SQLStore(userProviderMock, cfgMock, eventsDb,
+        localEventsDb, poolMock, permissionBackendMock);
     store.start();
     store.storeEvent(mockEvent);
     verify(eventsDb, times(1)).storeEvent(mockEvent);
@@ -238,15 +205,14 @@
 
   @Test
   public void noRetryOnZeroMaxTries() throws Exception {
-    MockEvent mockEvent = new MockEvent();
     when(cfgMock.getMaxTries()).thenReturn(0);
     Throwable[] exceptions = new Throwable[3];
     Arrays.fill(exceptions, new SQLException(new ConnectException()));
     setUpClientMock();
     doThrow(exceptions).doNothing().when(eventsDb).storeEvent(mockEvent);
     doThrow(exceptions).doNothing().when(eventsDb).queryOne();
-    store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
-        localEventsDb, poolMock);
+    store = new SQLStore(userProviderMock, cfgMock, eventsDb,
+        localEventsDb, poolMock, permissionBackendMock);
     store.start();
     store.storeEvent(mockEvent);
     verify(eventsDb, times(1)).storeEvent(mockEvent);
@@ -254,46 +220,36 @@
 
   @Test(expected = ServiceUnavailableException.class)
   public void throwSQLExceptionIfNotOnline() throws Exception {
-    MockEvent mockEvent = new MockEvent();
     setUpClientMock();
     doThrow(new SQLException(new ConnectException())).when(eventsDb)
         .createDBIfNotCreated();
     doThrow(new SQLException()).when(eventsDb).queryOne();
-    store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
-        localEventsDb, poolMock);
+    store = new SQLStore(userProviderMock, cfgMock, eventsDb,
+        localEventsDb, poolMock, permissionBackendMock);
     store.start();
     store.storeEvent(mockEvent);
     store.queryChangeEvents(GENERIC_QUERY);
   }
 
   @Test
-  public void restoreFromLocalAndRemoveUnfoundProjectEvents() throws Exception {
+  public void restoreEventsFromLocalDb() throws Exception {
     MockEvent mockEvent = new MockEvent();
     MockEvent mockEvent2 = new MockEvent("proj");
-    MockEvent mockEvent3 = new MockEvent("unfound");
-
-    ProjectControl pc = mock(ProjectControl.class);
-    NoSuchProjectException e = mock(NoSuchProjectException.class);
-    CurrentUser userMock = mock(CurrentUser.class);
-    when(userProviderMock.get()).thenReturn(userMock);
-    when(pcFactoryMock.controlFor((mockEvent.getProjectNameKey()), userMock))
-        .thenReturn(pc);
-    when(pcFactoryMock.controlFor((mockEvent2.getProjectNameKey()), userMock))
-        .thenReturn(pc);
-    when(pc.isVisible()).thenReturn(true);
-    doThrow(e).when(pcFactoryMock).controlFor((mockEvent3.getProjectNameKey()),
-        userMock);
+    when(permissionBackendMock.user(userProviderMock)).thenReturn(withUserMock);
+    when(withUserMock.project(any(Project.NameKey.class)))
+        .thenReturn(forProjectMock);
+    doNothing().when(forProjectMock).check(ProjectPermission.ACCESS);
 
     eventsDb = new SQLClient(TEST_DRIVER, TEST_URL, TEST_OPTIONS);
     localEventsDb = new SQLClient(TEST_DRIVER, TEST_LOCAL_URL, TEST_OPTIONS);
-    store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
-        localEventsDb, poolMock);
+    store = new SQLStore(userProviderMock, cfgMock, eventsDb,
+        localEventsDb, poolMock, permissionBackendMock);
 
     localEventsDb.createDBIfNotCreated();
     localEventsDb.storeEvent(mockEvent);
     localEventsDb.storeEvent(mockEvent2);
-    localEventsDb.storeEvent(mockEvent3);
     store.start();
+
     List<String> events = store.queryChangeEvents(GENERIC_QUERY);
     Gson gson = new Gson();
     String json = gson.toJson(mockEvent);
@@ -308,21 +264,20 @@
     doThrow(new SQLException(new ConnectException())).when(eventsDb)
         .createDBIfNotCreated();
     doThrow(new SQLException()).when(eventsDb).queryOne();
-    store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
-        localEventsDb, poolMock);
+    store = new SQLStore(userProviderMock, cfgMock, eventsDb,
+        localEventsDb, poolMock, permissionBackendMock);
     store.start();
     verify(localEventsDb).createDBIfNotCreated();
   }
 
   @Test
   public void storeLocalOffline() throws Exception {
-    MockEvent mockEvent = new MockEvent();
     setUpClientMock();
     doThrow(new SQLException(new ConnectException())).when(eventsDb)
         .createDBIfNotCreated();
     doThrow(new SQLException()).when(eventsDb).queryOne();
-    store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
-        localEventsDb, poolMock);
+    store = new SQLStore(userProviderMock, cfgMock, eventsDb,
+        localEventsDb, poolMock, permissionBackendMock);
     store.start();
     store.storeEvent(mockEvent);
     verify(localEventsDb).storeEvent(mockEvent);
@@ -330,19 +285,32 @@
 
   @Test
   public void storeLocalOfflineAfterNoRetry() throws Exception {
-    MockEvent mockEvent = new MockEvent();
     setUpClientMock();
     when(cfgMock.getMaxTries()).thenReturn(0);
     doThrow(new SQLException(new ConnectException())).when(eventsDb)
         .createDBIfNotCreated();
     doThrow(new SQLException()).when(eventsDb).queryOne();
-    store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
-        localEventsDb, poolMock);
+    store = new SQLStore(userProviderMock, cfgMock, eventsDb,
+        localEventsDb, poolMock, permissionBackendMock);
     store.start();
     store.storeEvent(mockEvent);
     verify(localEventsDb).storeEvent(mockEvent);
   }
 
+  private void setUpClient() {
+    eventsDb = new SQLClient(TEST_DRIVER, TEST_URL, TEST_OPTIONS);
+    localEventsDb = new SQLClient(TEST_DRIVER, TEST_LOCAL_URL, TEST_OPTIONS);
+    store = new SQLStore(userProviderMock, cfgMock, eventsDb,
+        localEventsDb, poolMock, permissionBackendMock);
+    store.start();
+  }
+
+  private void setUpClientMock() throws SQLException {
+    eventsDb = mock(SQLClient.class);
+    localEventsDb = mock(SQLClient.class);
+    when(localEventsDb.dbExists()).thenReturn(true);
+  }
+
   /**
    * For this test we expect that if we can connect to main database, then we
    * should come back online and try setting up again. We just want to make sure
@@ -356,8 +324,8 @@
     when(localEventsDb.dbExists()).thenReturn(true);
     when(localEventsDb.getAll())
         .thenReturn(ImmutableList.of(mock(SQLEntry.class)));
-    store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
-        localEventsDb, poolMock);
+    store = new SQLStore(userProviderMock, cfgMock, eventsDb,
+        localEventsDb, poolMock, permissionBackendMock);
     store.start();
     poolMock.scheduleWithFixedDelay(store.new CheckConnectionTask(), 0, 0,
         TimeUnit.MILLISECONDS);
@@ -375,7 +343,6 @@
   }
 
   private void checkConnectionAndRestore(boolean copy) throws Exception {
-    MockEvent mockEvent = new MockEvent();
     eventsDb = mock(SQLClient.class);
     localEventsDb = new SQLClient(TEST_DRIVER, TEST_LOCAL_URL, TEST_OPTIONS);
     localEventsDb.createDBIfNotCreated();
@@ -387,8 +354,8 @@
       when(cfgMock.getCopyLocal()).thenReturn(true);
     }
 
-    store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
-        localEventsDb, poolMock);
+    store = new SQLStore(userProviderMock, cfgMock, eventsDb,
+        localEventsDb, poolMock, permissionBackendMock);
     store.start();
     verify(eventsDb).queryOne();
     verify(eventsDb).storeEvent(any(String.class), any(Timestamp.class),
@@ -415,7 +382,7 @@
     }
   }
 
-  class PoolMock extends ScheduledExecutorService {
+  class PoolMock extends ScheduledThreadPoolExecutor {
     PoolMock() {
       super(1);
     }
diff --git a/tools/bazel.rc b/tools/bazel.rc
new file mode 100644
index 0000000..4ed16cf
--- /dev/null
+++ b/tools/bazel.rc
@@ -0,0 +1,2 @@
+build --workspace_status_command=./tools/workspace-status.sh
+test --build_tests_only
diff --git a/tools/bzl/BUILD b/tools/bzl/BUILD
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/bzl/BUILD
diff --git a/tools/bzl/classpath.bzl b/tools/bzl/classpath.bzl
new file mode 100644
index 0000000..d5764f7
--- /dev/null
+++ b/tools/bzl/classpath.bzl
@@ -0,0 +1,4 @@
+load(
+    "@com_googlesource_gerrit_bazlets//tools:classpath.bzl",
+    "classpath_collector",
+)
diff --git a/tools/bzl/junit.bzl b/tools/bzl/junit.bzl
new file mode 100644
index 0000000..3af7e58
--- /dev/null
+++ b/tools/bzl/junit.bzl
@@ -0,0 +1,4 @@
+load(
+    "@com_googlesource_gerrit_bazlets//tools:junit.bzl",
+    "junit_tests",
+)
diff --git a/tools/bzl/maven_jar.bzl b/tools/bzl/maven_jar.bzl
new file mode 100644
index 0000000..2eabedb
--- /dev/null
+++ b/tools/bzl/maven_jar.bzl
@@ -0,0 +1 @@
+load("@com_googlesource_gerrit_bazlets//tools:maven_jar.bzl", "maven_jar")
diff --git a/tools/bzl/plugin.bzl b/tools/bzl/plugin.bzl
new file mode 100644
index 0000000..a2e438f
--- /dev/null
+++ b/tools/bzl/plugin.bzl
@@ -0,0 +1,6 @@
+load(
+    "@com_googlesource_gerrit_bazlets//:gerrit_plugin.bzl",
+    "gerrit_plugin",
+    "PLUGIN_DEPS",
+    "PLUGIN_TEST_DEPS",
+)
diff --git a/tools/eclipse/BUILD b/tools/eclipse/BUILD
new file mode 100644
index 0000000..c2fa474
--- /dev/null
+++ b/tools/eclipse/BUILD
@@ -0,0 +1,9 @@
+load("//tools/bzl:classpath.bzl", "classpath_collector")
+
+classpath_collector(
+    name = "main_classpath_collect",
+    testonly = 1,
+    deps = [
+        "//:events-log__plugin_test_deps",
+    ],
+)
diff --git a/tools/eclipse/project.sh b/tools/eclipse/project.sh
new file mode 100755
index 0000000..d8a854d
--- /dev/null
+++ b/tools/eclipse/project.sh
@@ -0,0 +1,19 @@
+#!/bin/bash
+#Copyright (C) 2017 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+`bazel query @com_googlesource_gerrit_bazlets//tools/eclipse:project --output location | sed s/BUILD:.*//`project.py -n events-log -r .
+
+
diff --git a/tools/workspace-status.sh b/tools/workspace-status.sh
new file mode 100755
index 0000000..4e63364
--- /dev/null
+++ b/tools/workspace-status.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+#This script will be run by bazel when the build process starts to
+# generate key-value information that represents the status of the
+# workspace. The output should be like
+#
+# KEY1 VALUE1
+# KEY2 VALUE2
+#
+# If the script exits with non-zero code, it's considered as a failure
+# and the output will be discarded.
+
+function rev() {
+  cd $1; git describe --always --match "v[0-9].*" --dirty
+}
+
+echo STABLE_BUILD_EVENTS-LOG_LABEL $(rev .)