Merge branch 'stable-2.13' into stable-2.14
* stable-2.13:
Change copyright to AOSP
Build with API version 2.11.7
Change-Id: I2e93a8814059332f5348096565ebb2cf47860bdf
diff --git a/.buckconfig b/.buckconfig
deleted file mode 100644
index 1e032e5..0000000
--- a/.buckconfig
+++ /dev/null
@@ -1,15 +0,0 @@
-[alias]
- events-log = //:events-log
- plugin = //:events-log
- src = //:events-log-sources
-
-[java]
- src_roots = java, resources
-
-[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 7b55bc0..0000000
--- a/BUCK
+++ /dev/null
@@ -1,72 +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',
-]
-
-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,
-)
diff --git a/BUILD b/BUILD
new file mode 100644
index 0000000..da14708
--- /dev/null
+++ b/BUILD
@@ -0,0 +1,40 @@
+load("//tools/bzl:junit.bzl", "junit_tests")
+load(
+ "//tools/bzl:plugin.bzl",
+ "gerrit_plugin",
+ "PLUGIN_DEPS",
+ "PLUGIN_TEST_DEPS",
+)
+
+gerrit_plugin(
+ name = "events-log",
+ srcs = glob(["src/main/java/**/*.java"]),
+ 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 = [
+ ":events-log__plugin_test_deps",
+ ],
+)
+
+java_library(
+ name = "events-log__plugin_test_deps",
+ testonly = 1,
+ visibility = ["//visibility:public"],
+ exports = PLUGIN_DEPS + PLUGIN_TEST_DEPS + [
+ ":events-log__plugin",
+ "@mockito//jar",
+ ],
+)
diff --git a/WORKSPACE b/WORKSPACE
new file mode 100644
index 0000000..44dabc8
--- /dev/null
+++ b/WORKSPACE
@@ -0,0 +1,30 @@
+workspace(name = "events_log")
+
+load("//:bazlets.bzl", "load_bazlets")
+
+load_bazlets(
+ commit = "11ce7521051ca73598d099aa8a396c9ffe932a74",
+ # 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
new file mode 100644
index 0000000..e26b362
--- /dev/null
+++ b/external_plugin_deps.bzl
@@ -0,0 +1,33 @@
+load("//tools/bzl:maven_jar.bzl", "maven_jar")
+
+def external_plugin_deps():
+ maven_jar(
+ name = "mockito",
+ artifact = "org.mockito:mockito-core:2.15.0",
+ sha1 = "b84bfbbc29cd22c9529409627af6ea2897f4fa85",
+ deps = [
+ "@byte_buddy//jar",
+ "@byte_buddy_agent//jar",
+ "@objenesis//jar",
+ ],
+ )
+
+ BYTE_BUDDY_VER = "1.7.9"
+
+ maven_jar(
+ name = "byte_buddy",
+ artifact = "net.bytebuddy:byte-buddy:" + BYTE_BUDDY_VER,
+ sha1 = "51218a01a882c04d0aba8c028179cce488bbcb58",
+ )
+
+ maven_jar(
+ name = "byte_buddy_agent",
+ artifact = "net.bytebuddy:byte-buddy-agent:" + BYTE_BUDDY_VER,
+ sha1 = "a6c65f9da7f467ee1f02ff2841ffd3155aee2fc9",
+ )
+
+ maven_jar(
+ name = "objenesis",
+ artifact = "org.objenesis:objenesis:2.6",
+ sha1 = "639033469776fd37c08358c6b92a4761feb2af4b",
+ )
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 f83d917..0000000
--- a/lib/gerrit/BUCK
+++ /dev/null
@@ -1,22 +0,0 @@
-include_defs('//bucklets/maven_jar.bucklet')
-
-VER = '2.13'
-REPO = MAVEN_CENTRAL
-
-maven_jar(
- name = 'acceptance-framework',
- id = 'com.google.gerrit:gerrit-acceptance-framework:' + VER,
- sha1 = 'a6913a61196a8fccdb45e761f43a0b7e21867c90',
- license = 'Apache2.0',
- attach_source = False,
- repository = REPO,
-)
-
-maven_jar(
- name = 'plugin-api',
- id = 'com.google.gerrit:gerrit-plugin-api:' + VER,
- sha1 = 'e25d55b8f41627c4ae6b9d2069ec398638b219a3',
- license = 'Apache2.0',
- attach_source = False,
- repository = REPO,
-)
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventHandler.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventHandler.java
index 3ba78bb..262316c 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventHandler.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventHandler.java
@@ -18,26 +18,22 @@
import com.google.gerrit.server.events.Event;
import com.google.gerrit.server.events.ProjectEvent;
import com.google.inject.Inject;
-
import java.util.concurrent.ScheduledThreadPoolExecutor;
-/**
- * Listen to Events and store them into the EventStore
- */
+/** Listen to Events and store them into the EventStore */
class EventHandler implements EventListener {
private final EventStore store;
private final ScheduledThreadPoolExecutor pool;
@Inject
- EventHandler(EventStore store,
- @EventPool ScheduledThreadPoolExecutor pool) {
+ EventHandler(EventStore store, @EventPool ScheduledThreadPoolExecutor pool) {
this.store = store;
this.pool = pool;
}
@Override
public void onEvent(Event event) {
- if(event instanceof ProjectEvent) {
+ if (event instanceof ProjectEvent) {
pool.execute(new StoreEventTask((ProjectEvent) event));
}
}
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventModule.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventModule.java
index 6148522..906c0e8 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventModule.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventModule.java
@@ -21,7 +21,6 @@
import com.google.inject.Provides;
import com.google.inject.Scopes;
import com.google.inject.internal.UniqueAnnotations;
-
import java.util.concurrent.ScheduledThreadPoolExecutor;
/** Configures handling for an event queue while providing its pool. */
@@ -31,9 +30,7 @@
protected void configure() {
bind(EventQueue.class).in(Scopes.SINGLETON);
bind(EventHandler.class).in(Scopes.SINGLETON);
- bind(LifecycleListener.class)
- .annotatedWith(UniqueAnnotations.create())
- .to(EventQueue.class);
+ bind(LifecycleListener.class).annotatedWith(UniqueAnnotations.create()).to(EventQueue.class);
DynamicSet.bind(binder(), EventListener.class).to(EventHandler.class);
}
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventPool.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventPool.java
index 97324df..32e9465 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventPool.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventPool.java
@@ -17,13 +17,9 @@
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import com.google.inject.BindingAnnotation;
-
import java.lang.annotation.Retention;
-/**
- * Annotation applied to a ScheduledThreadPoolExecutor.
- */
+/** Annotation applied to a ScheduledThreadPoolExecutor. */
@Retention(RUNTIME)
@BindingAnnotation
-public @interface EventPool {
-}
+public @interface EventPool {}
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventQueue.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventQueue.java
index 07d5b41..eca051b 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventQueue.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventQueue.java
@@ -17,7 +17,6 @@
import com.google.gerrit.extensions.events.LifecycleListener;
import com.google.gerrit.server.git.WorkQueue;
import com.google.inject.Inject;
-
import java.util.concurrent.ScheduledThreadPoolExecutor;
/** A queue for events to store. */
@@ -30,10 +29,7 @@
this.workQueue = workQueue;
}
- /**
- * {@inheritDoc}
- * Create a new executor queue in WorkQueue for storing events.
- */
+ /** {@inheritDoc} Create a new executor queue in WorkQueue for storing events. */
@Override
public void start() {
pool = workQueue.createQueue(1, "Store events");
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventStore.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventStore.java
index a7785db..468404e 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventStore.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventStore.java
@@ -15,7 +15,6 @@
package com.ericsson.gerrit.plugins.eventslog;
import com.google.gerrit.server.events.ProjectEvent;
-
import java.util.List;
/** A store for change events to query. */
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 8432be4..e912faf 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventsLogConfig.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventsLogConfig.java
@@ -21,7 +21,6 @@
import com.google.gerrit.server.config.SitePaths;
import com.google.inject.Inject;
import com.google.inject.Singleton;
-
import java.nio.file.Path;
import java.nio.file.Paths;
@@ -49,7 +48,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,11 +63,10 @@
private String storeUsername;
private String storePassword;
private int evictIdleTime;
+ private String defaultUrl;
@Inject
- EventsLogConfig(PluginConfigFactory cfgFactory,
- SitePaths site,
- @PluginName String pluginName) {
+ EventsLogConfig(PluginConfigFactory cfgFactory, SitePaths site, @PluginName String pluginName) {
String defaultLocalPath = site.site_path.toString() + "/events-db/";
PluginConfig cfg = cfgFactory.getFromGerritConfig(pluginName, true);
copyLocal = cfg.getBoolean(CONFIG_COPY_LOCAL, DEFAULT_COPY_LOCAL);
@@ -79,19 +76,15 @@
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);
- localStorePath = Paths.get(cfg.getString(CONFIG_LOCAL_PATH,
- defaultLocalPath));
- urlOptions = concatenate(cfg.getStringList(CONFIG_URL_OPTIONS));
+ defaultUrl = "jdbc:h2:" + site.data_dir.toString() + "/db";
+ storeUrl = cfg.getString(CONFIG_URL, defaultUrl);
+ localStorePath = Paths.get(cfg.getString(CONFIG_LOCAL_PATH, defaultLocalPath));
+ urlOptions = Joiner.on(";").join(cfg.getStringList(CONFIG_URL_OPTIONS));
storeUsername = cfg.getString(CONFIG_USERNAME);
storePassword = cfg.getString(CONFIG_PASSWORD);
evictIdleTime = cfg.getInt(CONFIG_EVICT_IDLE_TIME, DEFAULT_EVICT_IDLE_TIME);
}
- private String concatenate(String[] stringList) {
- return Joiner.on(";").join(stringList);
- }
-
public int getMaxAge() {
return maxAge;
}
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventsLogException.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventsLogException.java
index 8227d22..70a8b74 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventsLogException.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventsLogException.java
@@ -19,8 +19,7 @@
private static final long serialVersionUID = 1L;
/**
- * Constructs an <code>EventsLogException</code> object with a given
- * <code>message</code>.
+ * Constructs an <code>EventsLogException</code> object with a given <code>message</code>.
*
* @param message a description of the exception
*/
@@ -29,12 +28,11 @@
}
/**
- * Constructs an <code>EventsLogException</code> object with a given
- * <code>message</code> and a given <code>cause</code>.
+ * Constructs an <code>EventsLogException</code> object with a given <code>message</code> and a
+ * given <code>cause</code>.
*
* @param message a description of the exception
- * @param cause the underlying reason for this
- * <code>EventsLogException</code>
+ * @param cause the underlying reason for this <code>EventsLogException</code>
*/
public EventsLogException(String message, Throwable cause) {
super(message, cause);
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventsRestApiServlet.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventsRestApiServlet.java
index 121e2d8..f05e33d 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventsRestApiServlet.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventsRestApiServlet.java
@@ -19,24 +19,20 @@
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
import java.io.IOException;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
-
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
@Singleton
class EventsRestApiServlet extends HttpServlet {
- private static final Logger log =
- LoggerFactory.getLogger(EventsRestApiServlet.class);
+ private static final Logger log = LoggerFactory.getLogger(EventsRestApiServlet.class);
private static final long serialVersionUID = 1L;
private final EventStore store;
@@ -44,9 +40,8 @@
private final Provider<CurrentUser> userProvider;
@Inject
- EventsRestApiServlet(EventStore store,
- QueryMaker queryMaker,
- Provider<CurrentUser> userProvider) {
+ EventsRestApiServlet(
+ EventStore store, QueryMaker queryMaker, Provider<CurrentUser> userProvider) {
this.store = store;
this.queryMaker = queryMaker;
this.userProvider = userProvider;
@@ -60,13 +55,10 @@
return;
}
rsp.setContentType("text/html");
- Map<String, String> params =
- req.getQueryString() != null ? getParameters(req) : null;
- Writer out = rsp.getWriter();
+ Map<String, String> params = req.getQueryString() != null ? getParameters(req) : null;
- String query = null;
- try {
- query = queryMaker.formQueryFromRequestParameters(params);
+ try (Writer out = rsp.getWriter()) {
+ String query = queryMaker.formQueryFromRequestParameters(params);
for (String event : store.queryChangeEvents(query)) {
out.write(event + "\n");
}
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/MalformedQueryException.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/MalformedQueryException.java
index 17caa1a..35f829d 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/MalformedQueryException.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/MalformedQueryException.java
@@ -20,20 +20,16 @@
private static final String MESSAGE =
"Query doesn't conform with the format required by the database";
- /**
- * Constructs a <code>MalformedQueryException</code> object with the default
- * message.
- */
+ /** Constructs a <code>MalformedQueryException</code> object with the default message. */
public MalformedQueryException() {
super(MESSAGE);
}
/**
- * Constructs a <code>MalformedQueryException</code> object with the default
- * message and a given <code>cause</code>.
+ * Constructs a <code>MalformedQueryException</code> object with the default message and a given
+ * <code>cause</code>.
*
- * @param cause the underlying reason for this
- * <code>MalformedQueryException</code>
+ * @param cause the underlying reason for this <code>MalformedQueryException</code>
*/
public MalformedQueryException(Throwable cause) {
super(MESSAGE, cause);
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/QueryMaker.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/QueryMaker.java
index bd55dbc..1969755 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/QueryMaker.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/QueryMaker.java
@@ -23,13 +23,11 @@
* Forms a String query based on the given parameters.
*
* @param params parameters which are used to form the query
- * @return a query based on the given parameters. The query should conform to
- * the format required by the database.
- * @throws MalformedQueryException if the given parameters do conform to
- * requirements
+ * @return a query based on the given parameters. The query should conform to the format required
+ * by the database.
+ * @throws MalformedQueryException if the given parameters do conform to requirements
*/
- String formQueryFromRequestParameters(Map<String, String> params)
- throws MalformedQueryException;
+ String formQueryFromRequestParameters(Map<String, String> params) throws MalformedQueryException;
/**
* Get the query designated as the default when no parameters are given.
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/ServiceUnavailableException.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/ServiceUnavailableException.java
index 57656e3..8689eb8 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/ServiceUnavailableException.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/ServiceUnavailableException.java
@@ -17,13 +17,9 @@
/** An exception type for when the events database cannot be queried. */
public class ServiceUnavailableException extends EventsLogException {
private static final long serialVersionUID = 1L;
- private static final String MESSAGE =
- "Database server disconnected, cannot query events";
+ private static final String MESSAGE = "Database server disconnected, cannot query events";
- /**
- * Constructs a <code>ServiceUnavailableException</code> object with the
- * default message.
- */
+ /** Constructs a <code>ServiceUnavailableException</code> object with the default message. */
public ServiceUnavailableException() {
super(MESSAGE);
}
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/EventsDb.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/EventsDb.java
index cf6d2d9..0016fde 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/EventsDb.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/EventsDb.java
@@ -17,13 +17,9 @@
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import com.google.inject.BindingAnnotation;
-
import java.lang.annotation.Retention;
-/**
- * Annotation applied to the SQLClient connected to the main database
- */
+/** Annotation applied to the SQLClient connected to the main database */
@Retention(RUNTIME)
@BindingAnnotation
-public @interface EventsDb {
-}
+public @interface EventsDb {}
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/LocalEventsDb.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/LocalEventsDb.java
index 0590d6e..654d9e8 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/LocalEventsDb.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/LocalEventsDb.java
@@ -17,13 +17,9 @@
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import com.google.inject.BindingAnnotation;
-
import java.lang.annotation.Retention;
-/**
- * Annotation applied to the SQLClient connected to the local database
- */
+/** Annotation applied to the SQLClient connected to the local database */
@Retention(RUNTIME)
@BindingAnnotation
-@interface LocalEventsDb {
-}
+@interface LocalEventsDb {}
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLClient.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLClient.java
index 9242ab3..97f9dad 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLClient.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLClient.java
@@ -24,22 +24,16 @@
import static java.util.concurrent.TimeUnit.MILLISECONDS;
import static java.util.concurrent.TimeUnit.SECONDS;
+import com.ericsson.gerrit.plugins.eventslog.EventsLogException;
+import com.ericsson.gerrit.plugins.eventslog.MalformedQueryException;
import com.google.common.base.Supplier;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ListMultimap;
import com.google.gerrit.server.events.ProjectEvent;
+import com.google.gerrit.server.events.SupplierSerializer;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.inject.Inject;
-import com.google.gerrit.server.events.SupplierSerializer;
-
-import com.ericsson.gerrit.plugins.eventslog.EventsLogException;
-import com.ericsson.gerrit.plugins.eventslog.MalformedQueryException;
-
-import org.apache.commons.dbcp.BasicDataSource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
@@ -47,6 +41,9 @@
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
+import org.apache.commons.dbcp.BasicDataSource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
class SQLClient {
private static final Logger log = LoggerFactory.getLogger(SQLClient.class);
@@ -59,8 +56,7 @@
ds.setDriverClassName(storeDriver);
ds.setUrl(storeUrl);
ds.setConnectionProperties(urlOptions);
- gson = new GsonBuilder()
- .registerTypeAdapter(Supplier.class, new SupplierSerializer()).create();
+ gson = new GsonBuilder().registerTypeAdapter(Supplier.class, new SupplierSerializer()).create();
}
/**
@@ -82,8 +78,7 @@
}
/**
- * Set the time before an idle connection is evicted as well as the
- * time between eviction runs.
+ * Set the time before an idle connection is evicted as well as the time between eviction runs.
*
* @param evictIdleTime the time in milliseconds before eviction
*/
@@ -110,8 +105,7 @@
*/
boolean dbExists() throws SQLException {
try (Connection conn = ds.getConnection();
- ResultSet tables =
- conn.getMetaData().getTables(null, null, TABLE_NAME, null)) {
+ ResultSet tables = conn.getMetaData().getTables(null, null, TABLE_NAME, null)) {
return tables.next();
}
}
@@ -125,15 +119,14 @@
}
/**
- * Get events as a multimap list of Strings and SQLEntries. The String
- * represents the project name, and the SQLEntry is the event information.
+ * Get events as a multimap list of Strings and SQLEntries. The String represents the project
+ * name, and the SQLEntry is the event information.
*
* @param query the query as a string
* @return Multimap list of Strings (project names) and SQLEntries (events)
* @throws EventsLogException If there was a problem with the database
*/
- ListMultimap<String, SQLEntry> getEvents(String query)
- throws EventsLogException {
+ ListMultimap<String, SQLEntry> getEvents(String query) throws EventsLogException {
try (Connection conn = ds.getConnection();
Statement stat = conn.createStatement()) {
return listEvents(stat, query);
@@ -149,7 +142,8 @@
* @throws SQLException If there was a problem with the database
*/
void storeEvent(ProjectEvent event) throws SQLException {
- storeEvent(event.getProjectNameKey().get(),
+ storeEvent(
+ event.getProjectNameKey().get(),
new Timestamp(SECONDS.toMillis(event.eventCreatedOn)),
gson.toJson(event));
}
@@ -162,11 +156,10 @@
* @param event The event as a string
* @throws SQLException If there was a problem with the database
*/
- void storeEvent(String projectName, Timestamp timestamp, String event)
- throws SQLException {
- execute(format("INSERT INTO %s(%s, %s, %s) ", TABLE_NAME, PROJECT_ENTRY,
- DATE_ENTRY, EVENT_ENTRY)
- + format("VALUES('%s', '%s', '%s')", projectName, timestamp, event));
+ void storeEvent(String projectName, Timestamp timestamp, String event) throws SQLException {
+ execute(
+ format("INSERT INTO %s(%s, %s, %s) ", TABLE_NAME, PROJECT_ENTRY, DATE_ENTRY, EVENT_ENTRY)
+ + format("VALUES('%s', '%s', '%s')", projectName, timestamp, event));
}
/**
@@ -176,12 +169,12 @@
*/
void removeOldEvents(int maxAge) {
try {
- execute(format(
- "DELETE FROM %s WHERE %s < '%s'",
- TABLE_NAME,
- DATE_ENTRY,
- new Timestamp(System.currentTimeMillis()
- - MILLISECONDS.convert(maxAge, DAYS))));
+ execute(
+ format(
+ "DELETE FROM %s WHERE %s < '%s'",
+ TABLE_NAME,
+ DATE_ENTRY,
+ new Timestamp(System.currentTimeMillis() - MILLISECONDS.convert(maxAge, DAYS))));
} catch (SQLException e) {
log.warn("Cannot remove old event entries from database", e);
}
@@ -194,17 +187,15 @@
*/
void removeProjectEvents(String project) {
try {
- execute(
- format("DELETE FROM %s WHERE project = '%s'", TABLE_NAME, project));
+ execute(format("DELETE FROM %s WHERE project = '%s'", TABLE_NAME, project));
} catch (SQLException e) {
- log.warn(
- "Cannot remove project " + project + " events from database", e);
+ log.warn("Cannot remove project " + project + " events from database", e);
}
}
/**
- * Do a simple query on the database. This is used to determine whether or
- * not the main database is online.
+ * Do a simple query on the database. This is used to determine whether or not the main database
+ * is online.
*
* @throws SQLException If there was a problem with the database
*/
@@ -224,9 +215,12 @@
Statement stat = conn.createStatement();
ResultSet rs = stat.executeQuery("SELECT * FROM " + TABLE_NAME)) {
while (rs.next()) {
- entries.add(new SQLEntry(rs.getString(PROJECT_ENTRY), rs
- .getTimestamp(DATE_ENTRY), rs.getString(EVENT_ENTRY), rs
- .getInt(PRIMARY_ENTRY)));
+ entries.add(
+ new SQLEntry(
+ rs.getString(PROJECT_ENTRY),
+ rs.getTimestamp(DATE_ENTRY),
+ rs.getString(EVENT_ENTRY),
+ rs.getInt(PRIMARY_ENTRY)));
}
return entries;
}
@@ -238,8 +232,10 @@
ListMultimap<String, SQLEntry> result = ArrayListMultimap.create();
while (rs.next()) {
SQLEntry entry =
- new SQLEntry(rs.getString(PROJECT_ENTRY),
- rs.getTimestamp(DATE_ENTRY), rs.getString(EVENT_ENTRY),
+ new SQLEntry(
+ rs.getString(PROJECT_ENTRY),
+ rs.getTimestamp(DATE_ENTRY),
+ rs.getString(EVENT_ENTRY),
rs.getInt(PRIMARY_ENTRY));
result.put(rs.getString(PROJECT_ENTRY), entry);
}
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLModule.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLModule.java
index 32572e3..a75335b 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLModule.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLModule.java
@@ -14,17 +14,16 @@
package com.ericsson.gerrit.plugins.eventslog.sql;
+import com.ericsson.gerrit.plugins.eventslog.EventModule;
+import com.ericsson.gerrit.plugins.eventslog.EventStore;
+import com.ericsson.gerrit.plugins.eventslog.EventsLogConfig;
+import com.ericsson.gerrit.plugins.eventslog.QueryMaker;
import com.google.gerrit.extensions.events.LifecycleListener;
import com.google.inject.AbstractModule;
import com.google.inject.Provides;
import com.google.inject.Singleton;
import com.google.inject.internal.UniqueAnnotations;
-import com.ericsson.gerrit.plugins.eventslog.EventModule;
-import com.ericsson.gerrit.plugins.eventslog.EventStore;
-import com.ericsson.gerrit.plugins.eventslog.EventsLogConfig;
-import com.ericsson.gerrit.plugins.eventslog.QueryMaker;
-
class SQLModule extends AbstractModule {
private static final String H2_DB_PREFIX = "jdbc:h2:";
@@ -33,8 +32,7 @@
protected void configure() {
install(new EventModule());
bind(EventStore.class).to(SQLStore.class);
- bind(LifecycleListener.class).annotatedWith(UniqueAnnotations.create()).to(
- SQLStore.class);
+ bind(LifecycleListener.class).annotatedWith(UniqueAnnotations.create()).to(SQLStore.class);
bind(QueryMaker.class).to(SQLQueryMaker.class);
}
@@ -42,8 +40,8 @@
@Singleton
@EventsDb
SQLClient provideSqlClient(EventsLogConfig cfg) {
- SQLClient sqlClient = new SQLClient(cfg.getStoreDriver(), cfg.getStoreUrl(),
- cfg.getUrlOptions());
+ SQLClient sqlClient =
+ new SQLClient(cfg.getStoreDriver(), cfg.getStoreUrl(), cfg.getUrlOptions());
sqlClient.setUsername(cfg.getStoreUsername());
sqlClient.setPassword(cfg.getStorePassword());
sqlClient.setEvictIdleTime(cfg.getEvictIdleTime());
@@ -56,8 +54,11 @@
SQLClient provideLocalSqlClient(EventsLogConfig cfg) {
String path = cfg.getLocalStorePath().toString();
path = path.endsWith("/") ? path : path + "/";
- SQLClient sqlClient = new SQLClient(cfg.getLocalStoreDriver(),
- H2_DB_PREFIX + path + SQLTable.TABLE_NAME, cfg.getUrlOptions());
+ SQLClient sqlClient =
+ new SQLClient(
+ cfg.getLocalStoreDriver(),
+ H2_DB_PREFIX + path + SQLTable.TABLE_NAME,
+ cfg.getUrlOptions());
sqlClient.setEvictIdleTime(cfg.getEvictIdleTime());
return sqlClient;
}
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLQueryMaker.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLQueryMaker.java
index 8ad81be..53e406c 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLQueryMaker.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLQueryMaker.java
@@ -18,18 +18,15 @@
import static com.ericsson.gerrit.plugins.eventslog.sql.SQLTable.PRIMARY_ENTRY;
import static com.ericsson.gerrit.plugins.eventslog.sql.SQLTable.TABLE_NAME;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
import com.ericsson.gerrit.plugins.eventslog.EventsLogConfig;
import com.ericsson.gerrit.plugins.eventslog.MalformedQueryException;
import com.ericsson.gerrit.plugins.eventslog.QueryMaker;
-
-import java.text.DateFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Calendar;
-import java.util.Date;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
import java.util.Map;
@Singleton
@@ -37,20 +34,10 @@
private static final int TWO = 2;
private static final String TIME_ONE = "t1";
private static final String TIME_TWO = "t2";
- private static final ThreadLocal<DateFormat> DATE_TIME_FORMAT =
- new ThreadLocal<DateFormat>() {
- @Override
- protected DateFormat initialValue() {
- return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- }
- };
- private static final ThreadLocal<DateFormat> DATE_ONLY_FORMAT =
- new ThreadLocal<DateFormat>() {
- @Override
- protected DateFormat initialValue() {
- return new SimpleDateFormat("yyyy-MM-dd");
- }
- };
+ private static final DateTimeFormatter DATE_TIME_FORMAT =
+ DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+ private static final DateTimeFormatter DATE_ONLY_FORMAT =
+ DateTimeFormatter.ofPattern("yyyy-MM-dd");
private final int returnLimit;
@@ -65,46 +52,52 @@
if (params == null) {
return getDefaultQuery();
}
- Date[] dates;
+ String[] dates;
try {
dates = parseDates(params.get(TIME_ONE), params.get(TIME_TWO));
- } catch (ParseException e) {
+ } catch (DateTimeParseException e) {
throw new MalformedQueryException(e);
}
return String.format(
- "SELECT * FROM %s WHERE %s BETWEEN '%s' and '%s' LIMIT %d", TABLE_NAME,
- DATE_ENTRY, DATE_TIME_FORMAT.get().format(dates[0]),
- DATE_TIME_FORMAT.get().format(dates[1]), returnLimit);
+ "SELECT * FROM %s WHERE %s BETWEEN '%s' and '%s' LIMIT %d",
+ TABLE_NAME, DATE_ENTRY, dates[0], dates[1], returnLimit);
}
@Override
public String getDefaultQuery() {
- return "SELECT * FROM(SELECT * FROM " + TABLE_NAME
- + " ORDER BY " + PRIMARY_ENTRY + " DESC LIMIT " + returnLimit + ")"
- + " a ORDER BY " + PRIMARY_ENTRY + " ASC";
+ return "SELECT * FROM(SELECT * FROM "
+ + TABLE_NAME
+ + " ORDER BY "
+ + PRIMARY_ENTRY
+ + " DESC LIMIT "
+ + returnLimit
+ + ")"
+ + " a ORDER BY "
+ + PRIMARY_ENTRY
+ + " ASC";
}
- private Date[] parseDates(String dateOne, String dateTwo)
- throws MalformedQueryException, ParseException {
+ private String[] parseDates(String dateOne, String dateTwo)
+ throws MalformedQueryException, DateTimeParseException {
if (dateOne == null && dateTwo == null) {
throw new MalformedQueryException();
}
- Calendar cal = Calendar.getInstance();
- Date dOne = dateOne == null ? cal.getTime() : parseDate(dateOne);
- Date dTwo = dateTwo == null ? cal.getTime() : parseDate(dateTwo);
- Date[] dates = new Date[TWO];
+ LocalDateTime dOne = dateOne == null ? LocalDateTime.now() : parseDate(dateOne);
+ LocalDateTime dTwo = dateTwo == null ? LocalDateTime.now() : parseDate(dateTwo);
+ LocalDateTime[] dates = new LocalDateTime[TWO];
- dates[0] = dOne.compareTo(dTwo) < 0 ? dOne : dTwo;
- dates[1] = dOne.compareTo(dTwo) < 0 ? dTwo : dOne;
- return dates;
+ dates[0] = dOne.isBefore(dTwo) ? dOne : dTwo;
+ dates[1] = dOne.isBefore(dTwo) ? dTwo : dOne;
+ return new String[] {DATE_TIME_FORMAT.format(dates[0]), DATE_TIME_FORMAT.format(dates[1])};
}
- private Date parseDate(String date) throws ParseException {
- Date parsedDate;
+ private LocalDateTime parseDate(String date) throws DateTimeParseException {
+ LocalDateTime parsedDate;
try {
- parsedDate = DATE_TIME_FORMAT.get().parse(date);
- } catch (ParseException e) {
- parsedDate = DATE_ONLY_FORMAT.get().parse(date);
+ parsedDate = LocalDateTime.parse(date, DATE_TIME_FORMAT);
+ } catch (DateTimeParseException e) {
+ LocalDate localDate = LocalDate.parse(date, DATE_ONLY_FORMAT);
+ parsedDate = localDate.atStartOfDay();
}
return parsedDate;
}
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLStore.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLStore.java
index b7beda8..d9445b5 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLStore.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLStore.java
@@ -16,6 +16,11 @@
import static com.ericsson.gerrit.plugins.eventslog.sql.SQLTable.TABLE_NAME;
+import com.ericsson.gerrit.plugins.eventslog.EventPool;
+import com.ericsson.gerrit.plugins.eventslog.EventStore;
+import com.ericsson.gerrit.plugins.eventslog.EventsLogConfig;
+import com.ericsson.gerrit.plugins.eventslog.EventsLogException;
+import com.ericsson.gerrit.plugins.eventslog.ServiceUnavailableException;
import com.google.common.io.Files;
import com.google.gerrit.common.TimeUtil;
import com.google.gerrit.extensions.events.LifecycleListener;
@@ -27,16 +32,6 @@
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
-
-import com.ericsson.gerrit.plugins.eventslog.EventPool;
-import com.ericsson.gerrit.plugins.eventslog.EventStore;
-import com.ericsson.gerrit.plugins.eventslog.EventsLogConfig;
-import com.ericsson.gerrit.plugins.eventslog.EventsLogException;
-import com.ericsson.gerrit.plugins.eventslog.ServiceUnavailableException;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
import java.io.File;
import java.io.IOException;
import java.net.ConnectException;
@@ -50,6 +45,8 @@
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
@Singleton
class SQLStore implements EventStore, LifecycleListener {
@@ -71,7 +68,8 @@
private Path localPath;
@Inject
- SQLStore(ProjectControl.GenericFactory projectControlFactory,
+ SQLStore(
+ ProjectControl.GenericFactory projectControlFactory,
Provider<CurrentUser> userProvider,
EventsLogConfig cfg,
@EventsDb SQLClient eventsDb,
@@ -103,9 +101,8 @@
}
/**
- * {@inheritDoc}
- * The events returned are restricted to the projects which are visible to
- * the user.
+ * {@inheritDoc} The events returned are restricted to the projects which are visible to the user.
+ *
* @throws ServiceUnavailableException if working in offline mode
*/
@Override
@@ -115,21 +112,22 @@
}
List<SQLEntry> entries = new ArrayList<>();
- for (Entry<String, Collection<SQLEntry>> entry
- : eventsDb.getEvents(query).asMap().entrySet()) {
+ for (Entry<String, Collection<SQLEntry>> entry : eventsDb.getEvents(query).asMap().entrySet()) {
String projectName = entry.getKey();
try {
- if (projectControlFactory.controlFor(new Project.NameKey(projectName),
- userProvider.get()).isVisible()) {
+ if (projectControlFactory
+ .controlFor(new Project.NameKey(projectName), userProvider.get())
+ .isVisible()) {
entries.addAll(entry.getValue());
}
} catch (NoSuchProjectException e) {
- log.warn("Database contains a non-existing project, " + projectName
- + ", removing project from database");
+ log.warn(
+ "Database contains a non-existing project, "
+ + projectName
+ + ", removing project from database");
eventsDb.removeProjectEvents(projectName);
} catch (IOException e) {
- log.warn("Cannot get project visibility info for " + projectName
- + " from cache", e);
+ log.warn("Cannot get project visibility info for " + projectName + " from cache", e);
}
}
return sortedEventsFromEntries(entries);
@@ -145,10 +143,9 @@
}
/**
- * {@inheritDoc}
- * If storing the event fails due to a connection problem, storage will be
- * re-attempted as specified in gerrit.config. After failing the maximum
- * amount of times, the event will be stored in a local h2 database.
+ * {@inheritDoc} If storing the event fails due to a connection problem, storage will be
+ * re-attempted as specified in gerrit.config. After failing the maximum amount of times, the
+ * event will be stored in a local h2 database.
*/
@Override
public void storeEvent(ProjectEvent event) {
@@ -170,8 +167,7 @@
try {
retryIfAllowed(failedConnections);
} catch (InterruptedException e1) {
- log.warn("Cannot store ChangeEvent for: " + projectName.get()
- + ": Interrupted");
+ log.warn("Cannot store ChangeEvent for: " + projectName.get() + ": Interrupted");
Thread.currentThread().interrupt();
return;
}
@@ -181,8 +177,7 @@
}
}
- private void retryIfAllowed(int failedConnections)
- throws InterruptedException {
+ private void retryIfAllowed(int failedConnections) throws InterruptedException {
if (failedConnections < maxTries - 1) {
log.info("Retrying store event");
Thread.sleep(waitTime);
@@ -196,8 +191,10 @@
try {
getEventsDb().createDBIfNotCreated();
} catch (SQLException e) {
- log.warn("Cannot start the database. Events will be stored locally"
- + " until database connection can be established", e);
+ log.warn(
+ "Cannot start the database. Events will be stored locally"
+ + " until database connection can be established",
+ e);
setOnline(false);
}
if (online) {
@@ -214,8 +211,9 @@
this.online = online;
setUp();
if (!online) {
- checkConnTask = pool.scheduleWithFixedDelay(
- new CheckConnectionTask(), 0, connectTime, TimeUnit.MILLISECONDS);
+ checkConnTask =
+ pool.scheduleWithFixedDelay(
+ new CheckConnectionTask(), 0, connectTime, TimeUnit.MILLISECONDS);
} else {
cancelCheckConnectionTaskIfScheduled(false);
}
@@ -249,16 +247,14 @@
private void restoreEvent(SQLEntry entry) {
try {
- eventsDb.storeEvent(entry.getName(), entry.getTimestamp(),
- entry.getEvent());
+ eventsDb.storeEvent(entry.getName(), entry.getTimestamp(), entry.getEvent());
} catch (SQLException e) {
log.warn("Could not restore events from local", e);
}
}
class CheckConnectionTask implements Runnable {
- CheckConnectionTask() {
- }
+ CheckConnectionTask() {}
@Override
public void run() {
@@ -290,9 +286,7 @@
try {
exists = localEventsDb.dbExists();
} catch (SQLException e) {
- log.warn(
- "Could not check existence of local database, assume that it doesn't exist",
- e);
+ log.warn("Could not check existence of local database, assume that it doesn't exist", e);
}
return exists;
}
@@ -302,9 +296,11 @@
return;
}
File file = localPath.resolve(TABLE_NAME + H2_DB_SUFFIX).toFile();
- File copyFile = localPath.resolve(TABLE_NAME
- + (TimeUnit.MILLISECONDS.toSeconds(TimeUtil.nowMs()))
- + H2_DB_SUFFIX).toFile();
+ File copyFile =
+ localPath
+ .resolve(
+ TABLE_NAME + (TimeUnit.MILLISECONDS.toSeconds(TimeUtil.nowMs())) + H2_DB_SUFFIX)
+ .toFile();
try {
Files.copy(file, copyFile);
} catch (IOException e) {
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLTable.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLTable.java
index 8102b1b..f25b618 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLTable.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLTable.java
@@ -23,8 +23,7 @@
static final String DATE_ENTRY = "date_created";
static final String EVENT_ENTRY = "event_info";
- private SQLTable() {
- }
+ private SQLTable() {}
static String createTableQuery(boolean postgresql) {
StringBuilder query = new StringBuilder();
diff --git a/src/main/resources/Documentation/build.md b/src/main/resources/Documentation/build.md
index 3756aa6..41a69ca 100644
--- a/src/main/resources/Documentation/build.md
+++ b/src/main/resources/Documentation/build.md
@@ -1,82 +1,75 @@
Build
=====
-This plugin is built with Buck.
+This plugin is built with Bazel. Two build modes are supported:
+ * Standalone
+ * In Gerrit tree.
-Buck
-----
+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).
-Two build modes are supported: Standalone and in Gerrit tree.
-The standalone build mode is recommended, as this mode doesn't require
-the Gerrit tree to exist locally.
+## Build standalone
-
-### Build standalone
-
-Clone bucklets library:
-
-```
- git clone https://gerrit.googlesource.com/bucklets
-
-```
-and link it to events-log plugin directory:
-
-```
- cd events-log && ln -s ../bucklets .
-```
-
-Add link to the .buckversion file:
-
-```
- cd events-log && ln -s bucklets/buckversion .buckversion
-```
-
-Add link to the .watchmanconfig file:
-
-```
- cd events-log && ln -s bucklets/watchmanconfig .watchmanconfig
-```
+### Bazel
To build the plugin, issue the following command:
```
- buck build plugin
+ bazel build @PLUGIN@
```
The output is created in
```
- buck-out/gen/events-log.jar
-```
-
-This project can be imported into the Eclipse IDE:
-
-```
- ./bucklets/tools/eclipse.py
+ bazel-genfiles/@PLUGIN@.jar
```
To execute the tests run:
```
- buck test
+ bazel test //...
```
-### Build in Gerrit tree
-
-Clone or link this plugin to the plugins directory of Gerrit's source
-tree, and issue the command:
+This project can be imported into the Eclipse IDE:
```
- buck build plugins/events-log
+ ./tools/eclipse/project.sh
```
+## Build in Gerrit tree
+
+### Bazel
+
+Clone (or link) this plugin to the `plugins` directory of Gerrit's source tree.
+
+Put the external dependency Bazel build file into the Gerrit /plugins directory,
+replacing the existing empty one.
+
+```
+ cd gerrit/plugins
+ rm external_plugin_deps.bzl
+ ln -s @PLUGIN@/external_plugin_deps.bzl .
+```
+
+Then issue
+
+```
+ bazel build plugins/@PLUGIN@
+```
+
+in the root of Gerrit's source tree to build
+
The output is created in
```
- buck-out/gen/plugins/events-log/events-log.jar
+ bazel-genfiles/plugins/@PLUGIN@/@PLUGIN@.jar
```
-This project can be imported into the Eclipse IDE:
+This project can be imported into the Eclipse IDE.
+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
@@ -85,8 +78,8 @@
To execute the tests run:
```
- buck test --include events-log
+ bazel test plugins/@PLUGIN@:events_log_tests
```
More information about Buck can be found in the [Gerrit
-documentation](../../../Documentation/dev-buck.html).
+documentation](../../../Documentation/dev-bazel.html).
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 b6c773b..f3eb207 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventHandlerTest.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventHandlerTest.java
@@ -21,19 +21,16 @@
import com.google.gerrit.server.events.ChangeEvent;
import com.google.gerrit.server.events.Event;
-
+import java.util.concurrent.ScheduledThreadPoolExecutor;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
-import java.util.concurrent.ScheduledThreadPoolExecutor;
-
@RunWith(MockitoJUnitRunner.class)
public class EventHandlerTest {
- @Mock
- private EventStore storeMock;
+ @Mock private EventStore storeMock;
private EventHandler eventHandler;
@Before
@@ -60,6 +57,7 @@
PoolMock() {
super(1);
}
+
@Override
public void execute(Runnable command) {
assertThat(command.toString()).isEqualTo("(Events-log) Insert Event");
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 f4cd273..0d19579 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;
@@ -43,7 +42,8 @@
import com.google.gerrit.server.config.PluginConfig;
import com.google.gerrit.server.config.PluginConfigFactory;
import com.google.gerrit.server.config.SitePaths;
-
+import java.io.IOException;
+import java.nio.file.Files;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -52,9 +52,6 @@
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
-import java.io.IOException;
-import java.nio.file.Files;
-
@RunWith(MockitoJUnitRunner.class)
public class EventsLogConfigTest {
private static final String PLUGIN_NAME = "eventsLog";
@@ -63,46 +60,38 @@
private SitePaths site;
private EventsLogConfig config;
private String defaultLocalStorePath;
+ private String defaultUrl;
private String localStorePath;
private String[] urlOptions = new String[] {"DB_CLOSE_DELAY=10"};
- @Mock
- private PluginConfigFactory cfgFactoryMock;
- @Mock
- private PluginConfig configMock;
+ @Mock private PluginConfigFactory cfgFactoryMock;
+ @Mock private PluginConfig configMock;
- @Rule
- public TemporaryFolder gerrit_site = new TemporaryFolder();
+ @Rule public TemporaryFolder gerrit_site = new TemporaryFolder();
@Before
public void setUp() throws IOException {
site = new SitePaths(gerrit_site.getRoot().toPath());
Files.createDirectories(site.etc_dir);
defaultLocalStorePath = site.site_path.toString() + "/events-db/";
- when(cfgFactoryMock.getFromGerritConfig(PLUGIN_NAME, true))
- .thenReturn(configMock);
+ defaultUrl = "jdbc:h2:" + site.data_dir.toString() + "/db";
+ when(cfgFactoryMock.getFromGerritConfig(PLUGIN_NAME, true)).thenReturn(configMock);
}
private void setUpDefaults() {
when(configMock.getBoolean(CONFIG_COPY_LOCAL, DEFAULT_COPY_LOCAL))
.thenReturn(DEFAULT_COPY_LOCAL);
- when(configMock.getInt(CONFIG_MAX_AGE, DEFAULT_MAX_AGE))
- .thenReturn(DEFAULT_MAX_AGE);
- when(configMock.getInt(CONFIG_MAX_TRIES, DEFAULT_MAX_TRIES))
- .thenReturn(DEFAULT_MAX_TRIES);
+ when(configMock.getInt(CONFIG_MAX_AGE, DEFAULT_MAX_AGE)).thenReturn(DEFAULT_MAX_AGE);
+ when(configMock.getInt(CONFIG_MAX_TRIES, DEFAULT_MAX_TRIES)).thenReturn(DEFAULT_MAX_TRIES);
when(configMock.getInt(CONFIG_RETURN_LIMIT, DEFAULT_RETURN_LIMIT))
.thenReturn(DEFAULT_RETURN_LIMIT);
- when(configMock.getInt(CONFIG_CONN_TIME, DEFAULT_CONN_TIME))
- .thenReturn(DEFAULT_CONN_TIME);
- when(configMock.getInt(CONFIG_WAIT_TIME, DEFAULT_WAIT_TIME))
- .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.getInt(CONFIG_CONN_TIME, DEFAULT_CONN_TIME)).thenReturn(DEFAULT_CONN_TIME);
+ when(configMock.getInt(CONFIG_WAIT_TIME, DEFAULT_WAIT_TIME)).thenReturn(DEFAULT_WAIT_TIME);
+ when(configMock.getString(CONFIG_DRIVER, DEFAULT_DRIVER)).thenReturn(DEFAULT_DRIVER);
+ when(configMock.getString(CONFIG_URL, defaultUrl)).thenReturn(defaultUrl);
when(configMock.getString(CONFIG_LOCAL_PATH, defaultLocalStorePath))
.thenReturn(defaultLocalStorePath);
- when(configMock.getStringList(CONFIG_URL_OPTIONS))
- .thenReturn(new String[] {});
+ when(configMock.getStringList(CONFIG_URL_OPTIONS)).thenReturn(new String[] {});
when(configMock.getString(CONFIG_USERNAME)).thenReturn(null);
when(configMock.getString(CONFIG_PASSWORD)).thenReturn(null);
when(configMock.getInt(CONFIG_EVICT_IDLE_TIME, DEFAULT_EVICT_IDLE_TIME))
@@ -111,28 +100,20 @@
private void setUpCustom() {
localStorePath = "~/gerrit/events-db/";
- when(configMock.getBoolean(CONFIG_COPY_LOCAL, DEFAULT_COPY_LOCAL))
- .thenReturn(true);
+ when(configMock.getBoolean(CONFIG_COPY_LOCAL, DEFAULT_COPY_LOCAL)).thenReturn(true);
when(configMock.getInt(CONFIG_MAX_AGE, DEFAULT_MAX_AGE)).thenReturn(20);
when(configMock.getInt(CONFIG_MAX_TRIES, DEFAULT_MAX_TRIES)).thenReturn(5);
- when(configMock.getInt(CONFIG_RETURN_LIMIT, DEFAULT_RETURN_LIMIT))
- .thenReturn(10000);
- when(configMock.getInt(CONFIG_CONN_TIME, DEFAULT_CONN_TIME))
- .thenReturn(5000);
- when(configMock.getInt(CONFIG_WAIT_TIME, DEFAULT_WAIT_TIME))
- .thenReturn(5000);
- when(configMock.getString(CONFIG_DRIVER, DEFAULT_DRIVER))
- .thenReturn("org.h2.Driver2");
- when(configMock.getString(CONFIG_URL, DEFAULT_URL))
- .thenReturn("jdbc:h2:~/gerrit/db");
- when(configMock.getString(CONFIG_LOCAL_PATH, defaultLocalStorePath))
- .thenReturn(localStorePath);
+ when(configMock.getInt(CONFIG_RETURN_LIMIT, DEFAULT_RETURN_LIMIT)).thenReturn(10000);
+ when(configMock.getInt(CONFIG_CONN_TIME, DEFAULT_CONN_TIME)).thenReturn(5000);
+ when(configMock.getInt(CONFIG_WAIT_TIME, DEFAULT_WAIT_TIME)).thenReturn(5000);
+ when(configMock.getString(CONFIG_DRIVER, DEFAULT_DRIVER)).thenReturn("org.h2.Driver2");
+ when(configMock.getString(CONFIG_URL, defaultUrl)).thenReturn("jdbc:h2:~/gerrit/db");
+ when(configMock.getString(CONFIG_LOCAL_PATH, defaultLocalStorePath)).thenReturn(localStorePath);
when(configMock.getStringList(CONFIG_URL_OPTIONS)).thenReturn(urlOptions);
when(configMock.getString(CONFIG_USERNAME)).thenReturn("testUsername");
when(configMock.getString(CONFIG_PASSWORD)).thenReturn("testPassword");
when(configMock.getInt(CONFIG_EVICT_IDLE_TIME, DEFAULT_EVICT_IDLE_TIME))
.thenReturn(CUSTOM_EVICT_IDLE_TIME);
-
}
@Test
@@ -146,10 +127,9 @@
assertThat(config.getConnectTime()).isEqualTo(1000);
assertThat(config.getWaitTime()).isEqualTo(1000);
assertThat(config.getLocalStoreDriver()).isEqualTo(DEFAULT_DRIVER);
- assertThat(config.getLocalStorePath().toString() + "/")
- .isEqualTo(defaultLocalStorePath);
+ 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();
@@ -167,12 +147,10 @@
assertThat(config.getConnectTime()).isEqualTo(5000);
assertThat(config.getWaitTime()).isEqualTo(5000);
assertThat(config.getLocalStoreDriver()).isEqualTo(DEFAULT_DRIVER);
- assertThat(config.getLocalStorePath().toString() + "/")
- .isEqualTo(localStorePath);
+ assertThat(config.getLocalStorePath().toString() + "/").isEqualTo(localStorePath);
assertThat(config.getStoreDriver()).isEqualTo("org.h2.Driver2");
assertThat(config.getStoreUrl()).isEqualTo("jdbc:h2:~/gerrit/db");
- assertThat(config.getUrlOptions())
- .isEqualTo(Joiner.on(";").join(urlOptions));
+ assertThat(config.getUrlOptions()).isEqualTo(Joiner.on(";").join(urlOptions));
assertThat(config.getStoreUsername()).isEqualTo("testUsername");
assertThat(config.getStorePassword()).isEqualTo("testPassword");
assertThat(config.getEvictIdleTime()).isEqualTo(CUSTOM_EVICT_IDLE_TIME);
diff --git a/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventsLogIT.java b/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventsLogIT.java
index cfb1cce..d87832a 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventsLogIT.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventsLogIT.java
@@ -17,11 +17,16 @@
import static com.google.common.truth.Truth.assertThat;
import com.google.gerrit.acceptance.GerritConfig;
-import com.google.gerrit.acceptance.PluginDaemonTest;
-
+import com.google.gerrit.acceptance.LightweightPluginDaemonTest;
+import com.google.gerrit.acceptance.TestPlugin;
import org.junit.Test;
-public class EventsLogIT extends PluginDaemonTest {
+@TestPlugin(
+ name = "events-log",
+ sysModule = "com.ericsson.gerrit.plugins.eventslog.sql.SQLModule",
+ httpModule = "com.ericsson.gerrit.plugins.eventslog.HttpModule"
+)
+public class EventsLogIT extends LightweightPluginDaemonTest {
@Test
@GerritConfig(name = "plugin.events-log.storeUrl", value = "jdbc:h2:mem:db")
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 bcccd07..917d9d8 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventsRestApiServletTest.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventsRestApiServletTest.java
@@ -23,7 +23,12 @@
import com.google.common.collect.ImmutableMap;
import com.google.gerrit.server.CurrentUser;
import com.google.inject.Provider;
-
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -32,39 +37,23 @@
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
@RunWith(MockitoJUnitRunner.class)
public class EventsRestApiServletTest {
private static final String RANDOM_QUERY = "random query";
- @Mock
- private EventStore storeMock;
- @Mock
- private QueryMaker queryMakerMock;
- @Mock
- private Provider<CurrentUser> userProviderMock;
- @Mock
- private CurrentUser userMock;
- @Mock
- private HttpServletRequest reqMock;
- @Mock
- private HttpServletResponse rspMock;
- @Captor
- private ArgumentCaptor<Map<String, String>> captor;
+ @Mock private EventStore storeMock;
+ @Mock private QueryMaker queryMakerMock;
+ @Mock private Provider<CurrentUser> userProviderMock;
+ @Mock private CurrentUser userMock;
+ @Mock private HttpServletRequest reqMock;
+ @Mock private HttpServletResponse rspMock;
+ @Captor private ArgumentCaptor<Map<String, String>> captor;
private EventsRestApiServlet eventServlet;
@Before
public void setUp() {
- eventServlet =
- new EventsRestApiServlet(storeMock, queryMakerMock, userProviderMock);
+ eventServlet = new EventsRestApiServlet(storeMock, queryMakerMock, userProviderMock);
when(userProviderMock.get()).thenReturn(userMock);
when(userMock.isIdentifiedUser()).thenReturn(true);
@@ -73,22 +62,17 @@
@Test
public void queryStringSplitting() throws Exception {
when(reqMock.getQueryString()).thenReturn("a=1;b=2");
- when(queryMakerMock.formQueryFromRequestParameters(captor.capture()))
- .thenReturn(RANDOM_QUERY);
- when(storeMock.queryChangeEvents(RANDOM_QUERY))
- .thenReturn(new ArrayList<String>());
+ when(queryMakerMock.formQueryFromRequestParameters(captor.capture())).thenReturn(RANDOM_QUERY);
+ when(storeMock.queryChangeEvents(RANDOM_QUERY)).thenReturn(new ArrayList<>());
eventServlet.doGet(reqMock, rspMock);
- assertThat(ImmutableMap.of("a", "1", "b", "2"))
- .isEqualTo(captor.getValue());
+ assertThat(ImmutableMap.of("a", "1", "b", "2")).isEqualTo(captor.getValue());
}
@Test
public void badQueryString() throws Exception {
when(reqMock.getQueryString()).thenReturn("a;b");
- when(queryMakerMock.formQueryFromRequestParameters(captor.capture()))
- .thenReturn(RANDOM_QUERY);
- when(storeMock.queryChangeEvents(RANDOM_QUERY))
- .thenReturn(new ArrayList<String>());
+ when(queryMakerMock.formQueryFromRequestParameters(captor.capture())).thenReturn(RANDOM_QUERY);
+ when(storeMock.queryChangeEvents(RANDOM_QUERY)).thenReturn(new ArrayList<>());
eventServlet.doGet(reqMock, rspMock);
assertThat(captor.getValue()).isEmpty();
}
@@ -116,8 +100,7 @@
PrintWriter outMock = mock(PrintWriter.class);
List<String> listMock = ImmutableList.of("event one", "event two");
when(rspMock.getWriter()).thenReturn(outMock);
- when(queryMakerMock.formQueryFromRequestParameters(captor.capture()))
- .thenReturn(RANDOM_QUERY);
+ when(queryMakerMock.formQueryFromRequestParameters(captor.capture())).thenReturn(RANDOM_QUERY);
when(storeMock.queryChangeEvents(RANDOM_QUERY)).thenReturn(listMock);
eventServlet.doGet(reqMock, rspMock);
verify(outMock).write(listMock.get(0) + "\n");
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 c7ec5d3..cd2a61d 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
@@ -17,12 +17,10 @@
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.when;
-import com.google.common.collect.ImmutableMap;
-
import com.ericsson.gerrit.plugins.eventslog.EventsLogConfig;
import com.ericsson.gerrit.plugins.eventslog.MalformedQueryException;
import com.ericsson.gerrit.plugins.eventslog.QueryMaker;
-
+import com.google.common.collect.ImmutableMap;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -39,8 +37,7 @@
private QueryMaker queryMaker;
private String defaultQuery;
- @Mock
- private EventsLogConfig cfgMock;
+ @Mock private EventsLogConfig cfgMock;
private String query;
@@ -53,60 +50,51 @@
@Test
public void returnDefaultQueryforNullMap() throws Exception {
- assertThat(queryMaker.formQueryFromRequestParameters(null))
- .isEqualTo(defaultQuery);
+ assertThat(queryMaker.formQueryFromRequestParameters(null)).isEqualTo(defaultQuery);
}
@Test(expected = MalformedQueryException.class)
public void badParameters() throws Exception {
- queryMaker.formQueryFromRequestParameters(
- ImmutableMap.of(T1, "13/13/32", T2, "14/10/10"));
+ queryMaker.formQueryFromRequestParameters(ImmutableMap.of(T1, "13/13/32", T2, "14/10/10"));
}
@Test
public void dateOneOnly() throws Exception {
- query = queryMaker
- .formQueryFromRequestParameters(ImmutableMap.of(T1, OLD_DATE));
+ query = queryMaker.formQueryFromRequestParameters(ImmutableMap.of(T1, OLD_DATE));
assertThat(query).contains(String.format("'%s' and ", OLD_DATE));
}
@Test
public void dateTwoOnly() throws Exception {
- query = queryMaker
- .formQueryFromRequestParameters(ImmutableMap.of(T2, OLD_DATE));
+ query = queryMaker.formQueryFromRequestParameters(ImmutableMap.of(T2, OLD_DATE));
assertThat(query).contains(String.format("'%s' and ", OLD_DATE));
}
@Test(expected = MalformedQueryException.class)
public void noDate() throws Exception {
- queryMaker
- .formQueryFromRequestParameters(ImmutableMap.<String, String> of());
+ queryMaker.formQueryFromRequestParameters(ImmutableMap.of());
}
@Test
public void dateOrdering() throws Exception {
- query = queryMaker.formQueryFromRequestParameters(
- ImmutableMap.of(T1, OLD_DATE, T2, NEW_DATE));
- assertThat(query)
- .contains(String.format("'%s' and '%s'", OLD_DATE, NEW_DATE));
+ query = queryMaker.formQueryFromRequestParameters(ImmutableMap.of(T1, OLD_DATE, T2, NEW_DATE));
+ assertThat(query).contains(String.format("'%s' and '%s'", OLD_DATE, NEW_DATE));
- query = queryMaker.formQueryFromRequestParameters(
- ImmutableMap.of(T1, NEW_DATE, T2, OLD_DATE));
- assertThat(query)
- .contains(String.format("'%s' and '%s'", OLD_DATE, NEW_DATE));
+ query = queryMaker.formQueryFromRequestParameters(ImmutableMap.of(T1, NEW_DATE, T2, OLD_DATE));
+ assertThat(query).contains(String.format("'%s' and '%s'", OLD_DATE, NEW_DATE));
}
@Test
public void bothDateTime() throws Exception {
- query = queryMaker.formQueryFromRequestParameters(
- ImmutableMap.of(T1, OLD_DATE, T2, NEW_DATE));
+ query = queryMaker.formQueryFromRequestParameters(ImmutableMap.of(T1, OLD_DATE, T2, NEW_DATE));
assertThat(query).isNotEqualTo(defaultQuery);
}
@Test
public void onlyDateNoTime() throws Exception {
- String query = queryMaker.formQueryFromRequestParameters(
- ImmutableMap.of(T1, "2013-10-10", T2, "2014-10-10"));
+ query =
+ queryMaker.formQueryFromRequestParameters(
+ ImmutableMap.of(T1, "2013-10-10", T2, "2014-10-10"));
assertThat(query).isNotEqualTo(defaultQuery);
}
}
diff --git a/src/test/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLEntryTest.java b/src/test/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLEntryTest.java
index eee066b..3fd3217 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLEntryTest.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLEntryTest.java
@@ -16,11 +16,10 @@
import static com.google.common.truth.Truth.assertThat;
-import org.junit.Before;
-import org.junit.Test;
-
import java.sql.Timestamp;
import java.util.Calendar;
+import org.junit.Before;
+import org.junit.Test;
public class SQLEntryTest {
@@ -67,11 +66,11 @@
assertThat(entry2.compareTo(entry1)).isEqualTo(-1);
}
+ @SuppressWarnings("unlikely-arg-type")
@Test
public void testEquals() throws Exception {
assertThat(entry1.equals(null)).isFalse();
assertThat(entry1.equals("String object")).isFalse();
- assertThat(entry1.equals(entry1)).isTrue();
assertThat(entry1.equals(entry2)).isFalse();
assertThat(entry1.equals(entry4)).isTrue();
}
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 4b674d5..7f3c81c 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
@@ -23,6 +23,9 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import com.ericsson.gerrit.plugins.eventslog.EventsLogConfig;
+import com.ericsson.gerrit.plugins.eventslog.MalformedQueryException;
+import com.ericsson.gerrit.plugins.eventslog.ServiceUnavailableException;
import com.google.common.collect.ImmutableList;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.client.Project.NameKey;
@@ -32,21 +35,6 @@
import com.google.gerrit.server.project.ProjectControl;
import com.google.gson.Gson;
import com.google.inject.Provider;
-
-import com.ericsson.gerrit.plugins.eventslog.EventsLogConfig;
-import com.ericsson.gerrit.plugins.eventslog.MalformedQueryException;
-import com.ericsson.gerrit.plugins.eventslog.ServiceUnavailableException;
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnitRunner;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
import java.io.IOException;
import java.net.ConnectException;
import java.sql.Connection;
@@ -59,6 +47,15 @@
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
@RunWith(MockitoJUnitRunner.class)
public class SQLStoreTest {
@@ -66,20 +63,16 @@
private static final String TEST_URL = "jdbc:h2:mem:" + TABLE_NAME;
private static final String TEST_LOCAL_URL = "jdbc:h2:mem:test";
private static final String TEST_DRIVER = "org.h2.Driver";
- private static final String TEST_OPTIONS =
- "DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false";
+ private static final String TEST_OPTIONS = "DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false";
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 ProjectControl.GenericFactory pcFactoryMock;
+ @Mock private Provider<CurrentUser> userProviderMock;
+ @Mock private EventsLogConfig cfgMock;
private SQLClient eventsDb;
private SQLClient localEventsDb;
private SQLStore store;
@@ -87,20 +80,18 @@
private Statement stat;
- @Rule
- public TemporaryFolder testFolder = new TemporaryFolder();
+ @Rule public TemporaryFolder testFolder = new TemporaryFolder();
@Before
public void setUp() throws SQLException {
- Connection conn =
- DriverManager.getConnection(TEST_URL + ";" + TEST_OPTIONS);
+ Connection conn = DriverManager.getConnection(TEST_URL + ";" + TEST_OPTIONS);
stat = conn.createStatement();
poolMock = new PoolMock();
when(cfgMock.getMaxAge()).thenReturn(5);
when(cfgMock.getLocalStorePath()).thenReturn(testFolder.getRoot().toPath());
}
- public void tearDown() throws Exception {
+ private void tearDown() throws Exception {
stat.execute("DROP TABLE " + TABLE_NAME);
store.stop();
}
@@ -108,8 +99,8 @@
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 =
+ new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb, localEventsDb, poolMock);
store.start();
}
@@ -125,7 +116,7 @@
store.storeEvent(mockEvent);
List<String> events = store.queryChangeEvents(GENERIC_QUERY);
String json = new Gson().toJson(mockEvent);
- assertThat(events).containsExactly(json);
+ assertThat(events).containsExactly(json).inOrder();
tearDown();
}
@@ -138,14 +129,12 @@
tearDown();
}
- private MockEvent setUpMocks(boolean isVisible)
- throws NoSuchProjectException, IOException {
+ 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(pcFactoryMock.controlFor(mockEvent.getProjectNameKey(), userMock)).thenReturn(pcMock);
when(pcMock.isVisible()).thenReturn(isVisible);
setUpClient();
return mockEvent;
@@ -165,7 +154,8 @@
CurrentUser userMock = mock(CurrentUser.class);
when(userProviderMock.get()).thenReturn(userMock);
NameKey projectNameKey = mockEvent.getProjectNameKey();
- doThrow(new NoSuchProjectException(projectMock)).when(pcFactoryMock)
+ doThrow(new NoSuchProjectException(projectMock))
+ .when(pcFactoryMock)
.controlFor(projectNameKey, userMock);
setUpClient();
store.storeEvent(mockEvent);
@@ -180,8 +170,7 @@
CurrentUser userMock = mock(CurrentUser.class);
when(userProviderMock.get()).thenReturn(userMock);
NameKey projectNameKey = mockEvent.getProjectNameKey();
- doThrow(new IOException()).when(pcFactoryMock).controlFor(projectNameKey,
- userMock);
+ doThrow(new IOException()).when(pcFactoryMock).controlFor(projectNameKey, userMock);
setUpClient();
store.storeEvent(mockEvent);
List<String> events = store.queryChangeEvents(GENERIC_QUERY);
@@ -198,8 +187,8 @@
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(pcFactoryMock, userProviderMock, cfgMock, eventsDb, localEventsDb, poolMock);
store.start();
store.storeEvent(mockEvent);
verify(eventsDb, times(3)).storeEvent(mockEvent);
@@ -215,8 +204,8 @@
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(pcFactoryMock, userProviderMock, cfgMock, eventsDb, localEventsDb, poolMock);
store.start();
store.storeEvent(mockEvent);
verify(eventsDb, times(3)).storeEvent(mockEvent);
@@ -229,8 +218,8 @@
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(pcFactoryMock, userProviderMock, cfgMock, eventsDb, localEventsDb, poolMock);
store.start();
store.storeEvent(mockEvent);
verify(eventsDb, times(1)).storeEvent(mockEvent);
@@ -245,8 +234,8 @@
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(pcFactoryMock, userProviderMock, cfgMock, eventsDb, localEventsDb, poolMock);
store.start();
store.storeEvent(mockEvent);
verify(eventsDb, times(1)).storeEvent(mockEvent);
@@ -256,11 +245,10 @@
public void throwSQLExceptionIfNotOnline() throws Exception {
MockEvent mockEvent = new MockEvent();
setUpClientMock();
- doThrow(new SQLException(new ConnectException())).when(eventsDb)
- .createDBIfNotCreated();
+ 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(pcFactoryMock, userProviderMock, cfgMock, eventsDb, localEventsDb, poolMock);
store.start();
store.storeEvent(mockEvent);
store.queryChangeEvents(GENERIC_QUERY);
@@ -276,18 +264,15 @@
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(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);
+ doThrow(e).when(pcFactoryMock).controlFor((mockEvent3.getProjectNameKey()), userMock);
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(pcFactoryMock, userProviderMock, cfgMock, eventsDb, localEventsDb, poolMock);
localEventsDb.createDBIfNotCreated();
localEventsDb.storeEvent(mockEvent);
@@ -298,18 +283,17 @@
Gson gson = new Gson();
String json = gson.toJson(mockEvent);
String json2 = gson.toJson(mockEvent2);
- assertThat(events).containsExactly(json, json2);
+ assertThat(events).containsExactly(json, json2).inOrder();
tearDown();
}
@Test
public void offlineUponStart() throws Exception {
setUpClientMock();
- doThrow(new SQLException(new ConnectException())).when(eventsDb)
- .createDBIfNotCreated();
+ 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(pcFactoryMock, userProviderMock, cfgMock, eventsDb, localEventsDb, poolMock);
store.start();
verify(localEventsDb).createDBIfNotCreated();
}
@@ -318,11 +302,10 @@
public void storeLocalOffline() throws Exception {
MockEvent mockEvent = new MockEvent();
setUpClientMock();
- doThrow(new SQLException(new ConnectException())).when(eventsDb)
- .createDBIfNotCreated();
+ 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(pcFactoryMock, userProviderMock, cfgMock, eventsDb, localEventsDb, poolMock);
store.start();
store.storeEvent(mockEvent);
verify(localEventsDb).storeEvent(mockEvent);
@@ -333,34 +316,30 @@
MockEvent mockEvent = new MockEvent();
setUpClientMock();
when(cfgMock.getMaxTries()).thenReturn(0);
- doThrow(new SQLException(new ConnectException())).when(eventsDb)
- .createDBIfNotCreated();
+ 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(pcFactoryMock, userProviderMock, cfgMock, eventsDb, localEventsDb, poolMock);
store.start();
store.storeEvent(mockEvent);
verify(localEventsDb).storeEvent(mockEvent);
}
/**
- * 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
- * that restoreEventsFromLocal gets called, so verifying that getLocalDBFile
- * is called is sufficient.
+ * 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 that restoreEventsFromLocal gets
+ * called, so verifying that getLocalDBFile is called is sufficient.
*/
@Test
public void testConnectionTask() throws Exception {
eventsDb = new SQLClient(TEST_DRIVER, TEST_URL, TEST_OPTIONS);
localEventsDb = mock(SQLClient.class);
when(localEventsDb.dbExists()).thenReturn(true);
- when(localEventsDb.getAll())
- .thenReturn(ImmutableList.of(mock(SQLEntry.class)));
- store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
- localEventsDb, poolMock);
+ when(localEventsDb.getAll()).thenReturn(ImmutableList.of(mock(SQLEntry.class)));
+ store =
+ new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb, localEventsDb, poolMock);
store.start();
- poolMock.scheduleWithFixedDelay(store.new CheckConnectionTask(), 0, 0,
- TimeUnit.MILLISECONDS);
+ poolMock.scheduleWithFixedDelay(store.new CheckConnectionTask(), 0, 0, TimeUnit.MILLISECONDS);
verify(localEventsDb, times(2)).removeOldEvents(0);
}
@@ -380,19 +359,20 @@
localEventsDb = new SQLClient(TEST_DRIVER, TEST_LOCAL_URL, TEST_OPTIONS);
localEventsDb.createDBIfNotCreated();
localEventsDb.storeEvent(mockEvent);
- doThrow(new SQLException(new ConnectException())).doNothing().when(eventsDb)
+ doThrow(new SQLException(new ConnectException()))
+ .doNothing()
+ .when(eventsDb)
.createDBIfNotCreated();
if (copy) {
when(cfgMock.getCopyLocal()).thenReturn(true);
}
- store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
- localEventsDb, poolMock);
+ store =
+ new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb, localEventsDb, poolMock);
store.start();
verify(eventsDb).queryOne();
- verify(eventsDb).storeEvent(any(String.class), any(Timestamp.class),
- any(String.class));
+ verify(eventsDb).storeEvent(any(String.class), any(Timestamp.class), any(String.class));
List<SQLEntry> entries = localEventsDb.getAll();
assertThat(entries).isEmpty();
}
@@ -421,8 +401,8 @@
}
@Override
- public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
- long initialDelay, long delay, TimeUnit unit) {
+ public ScheduledFuture<?> scheduleWithFixedDelay(
+ Runnable command, long initialDelay, long delay, TimeUnit unit) {
log.info(command.toString());
command.run();
return null;
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/sonar/sonar.sh b/tools/sonar/sonar.sh
new file mode 100755
index 0000000..39df185
--- /dev/null
+++ b/tools/sonar/sonar.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+# Copyright (C) 2018 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/sonar:sonar --output location | sed s/BUILD:.*//`sonar.py
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 .)