Merge branch 'stable-2.15' into stable-2.16
* stable-2.15:
Upgrade bazlets to latest stable-2.15 to build with 2.15.19 API
Upgrade bazlets to latest stable-2.14 to build with 2.14.21 API
Change-Id: I7119ae15a234e72abb86a46eb2075a4c7fb57c01
diff --git a/.bazelversion b/.bazelversion
index 9084fa2..fd2a018 100644
--- a/.bazelversion
+++ b/.bazelversion
@@ -1 +1 @@
-1.1.0
+3.1.0
diff --git a/WORKSPACE b/WORKSPACE
index 3f4423e..3796c3d 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -3,7 +3,7 @@
load("//:bazlets.bzl", "load_bazlets")
load_bazlets(
- commit = "9af263722b7eafe99af079d6ef7cf1de23e6f8d7",
+ commit = "fff6f20bb2eceaf872a8acf8ad51471c25a82d38",
#local_path = "/home/<user>/projects/bazlets",
)
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 15f830a..6a020c5 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventHandler.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventHandler.java
@@ -14,8 +14,8 @@
package com.ericsson.gerrit.plugins.eventslog;
-import com.google.gerrit.common.EventListener;
import com.google.gerrit.server.events.Event;
+import com.google.gerrit.server.events.EventListener;
import com.google.gerrit.server.events.ProjectEvent;
import com.google.inject.Inject;
import java.util.concurrent.ScheduledExecutorService;
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 b888425..3f905c7 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventModule.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventModule.java
@@ -15,10 +15,10 @@
package com.ericsson.gerrit.plugins.eventslog;
import com.ericsson.gerrit.plugins.eventslog.sql.EventsLogCleaner;
-import com.google.gerrit.common.EventListener;
import com.google.gerrit.extensions.events.LifecycleListener;
import com.google.gerrit.extensions.events.ProjectDeletedListener;
import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.server.events.EventListener;
import com.google.inject.AbstractModule;
import com.google.inject.Provides;
import com.google.inject.Scopes;
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 f05e33d..c04d6ac 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventsRestApiServlet.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventsRestApiServlet.java
@@ -14,6 +14,7 @@
package com.ericsson.gerrit.plugins.eventslog;
+import com.google.common.flogger.FluentLogger;
import com.google.gerrit.extensions.restapi.Url;
import com.google.gerrit.server.CurrentUser;
import com.google.inject.Inject;
@@ -27,12 +28,10 @@
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 FluentLogger log = FluentLogger.forEnclosingClass();
private static final long serialVersionUID = 1L;
private final EventStore store;
@@ -63,13 +62,13 @@
out.write(event + "\n");
}
} catch (MalformedQueryException e) {
- log.error("Bad Request", e);
+ log.atSevere().withCause(e).log("Bad Request");
rsp.sendError(HttpServletResponse.SC_BAD_REQUEST);
} catch (ServiceUnavailableException e) {
- log.error("Service Unavailable", e);
+ log.atSevere().withCause(e).log("Service Unavailable");
rsp.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
} catch (EventsLogException e) {
- log.error("Could not query from request parameters", e);
+ log.atSevere().withCause(e).log("Could not query from request parameters");
}
}
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 9e538e6..b554ecd 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
@@ -29,6 +29,7 @@
import com.google.common.base.Supplier;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ListMultimap;
+import com.google.common.flogger.FluentLogger;
import com.google.gerrit.server.events.ProjectEvent;
import com.google.gerrit.server.events.SupplierSerializer;
import com.google.gson.Gson;
@@ -42,11 +43,9 @@
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
class SQLClient {
- private static final Logger log = LoggerFactory.getLogger(SQLClient.class);
+ private static final FluentLogger log = FluentLogger.forEnclosingClass();
private final Gson gson;
private final SQLDialect databaseDialect;
@@ -144,9 +143,11 @@
TABLE_NAME,
DATE_ENTRY,
new Timestamp(System.currentTimeMillis() - MILLISECONDS.convert(maxAge, DAYS))));
- log.info("Events older than {} days were removed from database {}", maxAge, ds.getPoolName());
+ log.atInfo().log(
+ "Events older than %d days were removed from database %s", maxAge, ds.getPoolName());
} catch (SQLException e) {
- log.warn("Cannot remove old event entries from database {}", ds.getPoolName(), e);
+ log.atWarning().withCause(e).log(
+ "Cannot remove old event entries from database %s", ds.getPoolName());
}
}
@@ -159,7 +160,7 @@
try {
execute(format("DELETE FROM %s WHERE project = '%s'", TABLE_NAME, project));
} catch (SQLException e) {
- log.warn("Cannot remove project {} events from database", project, e);
+ log.atWarning().withCause(e).log("Cannot remove project %s events from database", project);
}
}
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 ba38c4e..1717570 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
@@ -22,18 +22,17 @@
import com.ericsson.gerrit.plugins.eventslog.EventsLogConfig;
import com.ericsson.gerrit.plugins.eventslog.EventsLogException;
import com.ericsson.gerrit.plugins.eventslog.ServiceUnavailableException;
-import com.google.gerrit.common.TimeUtil;
+import com.google.common.flogger.FluentLogger;
import com.google.gerrit.extensions.annotations.PluginName;
import com.google.gerrit.extensions.events.LifecycleListener;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.events.ProjectEvent;
import com.google.gerrit.server.permissions.PermissionBackend;
import com.google.gerrit.server.permissions.PermissionBackendException;
import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.gerrit.server.util.time.TimeUtil;
import com.google.inject.Inject;
-import com.google.inject.Provider;
import com.google.inject.Singleton;
import java.io.IOException;
import java.net.ConnectException;
@@ -47,15 +46,12 @@
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
@Singleton
class SQLStore implements EventStore, LifecycleListener {
- private static final Logger log = LoggerFactory.getLogger(SQLStore.class);
+ private static final FluentLogger log = FluentLogger.forEnclosingClass();
private static final String H2_DB_SUFFIX = ".h2.db";
- private final Provider<CurrentUser> userProvider;
private final EventsLogCleaner eventsLogCleaner;
private SQLClient eventsDb;
private SQLClient localEventsDb;
@@ -73,7 +69,6 @@
@Inject
SQLStore(
- Provider<CurrentUser> userProvider,
EventsLogConfig cfg,
@EventsDb SQLClient eventsDb,
@LocalEventsDb SQLClient localEventsDb,
@@ -86,7 +81,6 @@
this.waitTime = cfg.getWaitTime();
this.connectTime = cfg.getConnectTime();
this.copyLocal = cfg.getCopyLocal();
- this.userProvider = userProvider;
this.eventsDb = eventsDb;
this.localEventsDb = localEventsDb;
this.eventsLogCleaner = eventsLogCleaner;
@@ -125,14 +119,14 @@
String projectName = entry.getKey();
try {
permissionBackend
- .user(userProvider)
+ .currentUser()
.project(new Project.NameKey(projectName))
.check(ProjectPermission.ACCESS);
entries.addAll(entry.getValue());
} catch (AuthException e) {
// Ignore
} catch (PermissionBackendException e) {
- log.warn("Cannot check project access permission", e);
+ log.atWarning().withCause(e).log("Cannot check project access permission");
}
}
return entries.stream().sorted().map(SQLEntry::getEvent).collect(toList());
@@ -156,14 +150,14 @@
try {
getEventsDb().storeEvent(event);
} catch (SQLException e) {
- log.warn("Cannot store ChangeEvent for: {}", projectName.get(), e);
+ log.atWarning().withCause(e).log("Cannot store ChangeEvent for: %s}", projectName.get());
if (e.getCause() instanceof ConnectException
|| e.getMessage().contains("terminating connection")) {
done = false;
try {
retryIfAllowed(failedConnections);
} catch (InterruptedException e1) {
- log.warn("Cannot store ChangeEvent for {}: Interrupted", projectName.get());
+ log.atWarning().log("Cannot store ChangeEvent for %s: Interrupted", projectName.get());
Thread.currentThread().interrupt();
return;
}
@@ -175,10 +169,10 @@
private void retryIfAllowed(int failedConnections) throws InterruptedException {
if (failedConnections < maxTries - 1) {
- log.info("Retrying store event");
+ log.atInfo().log("Retrying store event");
Thread.sleep(waitTime);
} else {
- log.error("Failed to store event {} times", maxTries);
+ log.atSevere().log("Failed to store event %d times", maxTries);
setOnline(false);
}
}
@@ -187,10 +181,9 @@
try {
getEventsDb().createDBIfNotCreated();
} catch (SQLException e) {
- log.warn(
+ log.atWarning().withCause(e).log(
"Cannot start the database. Events will be stored locally"
- + " until database connection can be established",
- e);
+ + " until database connection can be established");
setOnline(false);
}
if (online) {
@@ -227,14 +220,14 @@
try {
List<SQLEntry> entries = localEventsDb.getAll();
if (entries.isEmpty()) {
- log.debug("No events to restore from local");
+ log.atFine().log("No events to restore from local");
return;
}
for (SQLEntry entry : entries) {
restoreEvent(entry);
}
} catch (SQLException e) {
- log.warn("Could not query all events from local", e);
+ log.atWarning().withCause(e).log("Could not query all events from local");
}
copyFile(copyLocal);
localEventsDb.removeOldEvents(0);
@@ -244,7 +237,7 @@
try {
eventsDb.storeEvent(entry.getName(), entry.getTimestamp(), entry.getEvent());
} catch (SQLException e) {
- log.warn("Could not restore events from local", e);
+ log.atWarning().withCause(e).log("Could not restore events from local");
}
}
@@ -259,7 +252,7 @@
public void run() {
if (checkConnection()) {
setOnline(true);
- log.info("Connected to database");
+ log.atInfo().log("Connected to database");
}
}
@@ -269,12 +262,12 @@
}
private boolean checkConnection() {
- log.debug("Checking database connection...");
+ log.atFine().log("Checking database connection...");
try {
eventsDb.queryOne();
return true;
} catch (SQLException e) {
- log.error("Problem checking database connection", e);
+ log.atSevere().withCause(e).log("Problem checking database connection");
return false;
}
}
@@ -285,7 +278,8 @@
try {
exists = localEventsDb.dbExists();
} catch (SQLException e) {
- log.warn("Could not check existence of local database, assume that it doesn't exist", e);
+ log.atWarning().withCause(e).log(
+ "Could not check existence of local database, assume that it doesn't exist");
}
return exists;
}
@@ -301,7 +295,7 @@
try {
Files.copy(file, copyFile);
} catch (IOException e) {
- log.warn("Could not copy local database file with timestamp", e);
+ log.atWarning().withCause(e).log("Could not copy local database file with timestamp");
}
}
}
diff --git a/src/main/resources/Documentation/build.md b/src/main/resources/Documentation/build.md
index 130cc2a..d3805cf 100644
--- a/src/main/resources/Documentation/build.md
+++ b/src/main/resources/Documentation/build.md
@@ -66,6 +66,13 @@
bazel-bin/plugins/@PLUGIN@/@PLUGIN@.jar
```
+To execute the tests run either one of:
+
+```
+ bazel test --test_tag_filters=@PLUGIN@ //...
+ bazel test plugins/@PLUGIN@:@PLUGIN@_tests
+```
+
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
@@ -75,11 +82,9 @@
./tools/eclipse/project.py
```
-To execute the tests run:
-
-```
- bazel test plugins/@PLUGIN@:events-log_tests
-```
-
-More information about Buck can be found in the [Gerrit
+More information about Bazel can be found in the [Gerrit
documentation](../../../Documentation/dev-bazel.html).
+
+[Back to @PLUGIN@ documentation index][index]
+
+[index]: index.html
diff --git a/src/main/resources/Documentation/rest-api-events.md b/src/main/resources/Documentation/rest-api-events.md
index 785019d..a61b1c7 100644
--- a/src/main/resources/Documentation/rest-api-events.md
+++ b/src/main/resources/Documentation/rest-api-events.md
@@ -1,4 +1,4 @@
-@PLUGIN@ - /events/ REST API
+@PLUGIN@ - /plugins/@PLUGIN@/events/ REST API
==================
Events Endpoints
@@ -6,7 +6,7 @@
### List Events
-'GET /events/'
+'GET /plugins/@PLUGIN@/events/'
Lists events that have happened. Will list the _n_ most recent events where _n_
is the limit specified in the plugin configuration. See stream-events command
@@ -16,7 +16,7 @@
Request
```
- GET /events/ HTTP/1.0
+ GET /plugins/@PLUGIN@/events/ HTTP/1.0
```
Response
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 e759637..89448e4 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
@@ -28,14 +28,13 @@
import com.ericsson.gerrit.plugins.eventslog.MalformedQueryException;
import com.ericsson.gerrit.plugins.eventslog.ServiceUnavailableException;
import com.google.common.collect.ImmutableList;
+import com.google.common.flogger.FluentLogger;
import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.events.ProjectEvent;
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;
import com.zaxxer.hikari.HikariConfig;
import java.net.ConnectException;
import java.sql.Connection;
@@ -57,12 +56,10 @@
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 {
- private static final Logger log = LoggerFactory.getLogger(SQLStoreTest.class);
+ private static final FluentLogger log = FluentLogger.forEnclosingClass();
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_OPTIONS = "DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false";
@@ -71,7 +68,6 @@
private static final String GENERIC_QUERY = "SELECT * FROM " + TABLE_NAME;
private static final String PLUGIN_NAME = "events-log";
- @Mock private Provider<CurrentUser> userProviderMock;
@Mock private EventsLogConfig cfgMock;
@Mock private PermissionBackend permissionBackendMock;
@Mock private PermissionBackend.ForProject forProjectMock;
@@ -111,7 +107,7 @@
@Test
public void storeThenQueryVisible() throws Exception {
- when(permissionBackendMock.user(userProviderMock)).thenReturn(withUserMock);
+ when(permissionBackendMock.currentUser()).thenReturn(withUserMock);
when(withUserMock.project(any(Project.NameKey.class))).thenReturn(forProjectMock);
doNothing().when(forProjectMock).check(ProjectPermission.ACCESS);
setUpClient();
@@ -123,7 +119,7 @@
@Test
public void storeThenQueryNotVisible() throws Exception {
- when(permissionBackendMock.user(userProviderMock)).thenReturn(withUserMock);
+ when(permissionBackendMock.currentUser()).thenReturn(withUserMock);
when(withUserMock.project(any(Project.NameKey.class))).thenReturn(forProjectMock);
doThrow(new PermissionBackendException(""))
.when(forProjectMock)
@@ -143,7 +139,7 @@
@Test
public void notReturnEventWithNoVisibilityInfo() throws Exception {
- when(permissionBackendMock.user(userProviderMock)).thenReturn(withUserMock);
+ when(permissionBackendMock.currentUser()).thenReturn(withUserMock);
when(withUserMock.project(any(Project.NameKey.class))).thenReturn(forProjectMock);
doThrow(new PermissionBackendException(""))
.when(forProjectMock)
@@ -164,7 +160,6 @@
doThrow(exceptions).doNothing().when(eventsDb).queryOne();
store =
new SQLStore(
- userProviderMock,
cfgMock,
eventsDb,
localEventsDb,
@@ -187,9 +182,9 @@
setUpClientMock();
doThrow(exceptions).doNothing().when(eventsDb).storeEvent(mockEvent);
doThrow(exceptions).doNothing().when(eventsDb).queryOne();
+
store =
new SQLStore(
- userProviderMock,
cfgMock,
eventsDb,
localEventsDb,
@@ -209,9 +204,9 @@
when(cfgMock.getMaxTries()).thenReturn(3);
setUpClientMock();
doThrow(new SQLException(MSG)).when(eventsDb).storeEvent(mockEvent);
+
store =
new SQLStore(
- userProviderMock,
cfgMock,
eventsDb,
localEventsDb,
@@ -233,9 +228,9 @@
setUpClientMock();
doThrow(exceptions).doNothing().when(eventsDb).storeEvent(mockEvent);
doThrow(exceptions).doNothing().when(eventsDb).queryOne();
+
store =
new SQLStore(
- userProviderMock,
cfgMock,
eventsDb,
localEventsDb,
@@ -254,9 +249,9 @@
setUpClientMock();
doThrow(new SQLException(new ConnectException())).when(eventsDb).createDBIfNotCreated();
doThrow(new SQLException()).when(eventsDb).queryOne();
+
store =
new SQLStore(
- userProviderMock,
cfgMock,
eventsDb,
localEventsDb,
@@ -274,7 +269,8 @@
public void restoreEventsFromLocalDb() throws Exception {
MockEvent mockEvent = new MockEvent();
MockEvent mockEvent2 = new MockEvent("proj");
- when(permissionBackendMock.user(userProviderMock)).thenReturn(withUserMock);
+
+ when(permissionBackendMock.currentUser()).thenReturn(withUserMock);
when(withUserMock.project(any(Project.NameKey.class))).thenReturn(forProjectMock);
doNothing().when(forProjectMock).check(ProjectPermission.ACCESS);
@@ -284,7 +280,6 @@
localEventsDb = new SQLClient(config);
store =
new SQLStore(
- userProviderMock,
cfgMock,
eventsDb,
localEventsDb,
@@ -302,6 +297,9 @@
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();
}
@@ -310,9 +308,9 @@
setUpClientMock();
doThrow(new SQLException(new ConnectException())).when(eventsDb).createDBIfNotCreated();
doThrow(new SQLException()).when(eventsDb).queryOne();
+
store =
new SQLStore(
- userProviderMock,
cfgMock,
eventsDb,
localEventsDb,
@@ -330,9 +328,9 @@
setUpClientMock();
doThrow(new SQLException(new ConnectException())).when(eventsDb).createDBIfNotCreated();
doThrow(new SQLException()).when(eventsDb).queryOne();
+
store =
new SQLStore(
- userProviderMock,
cfgMock,
eventsDb,
localEventsDb,
@@ -352,9 +350,9 @@
when(cfgMock.getMaxTries()).thenReturn(0);
doThrow(new SQLException(new ConnectException())).when(eventsDb).createDBIfNotCreated();
doThrow(new SQLException()).when(eventsDb).queryOne();
+
store =
new SQLStore(
- userProviderMock,
cfgMock,
eventsDb,
localEventsDb,
@@ -369,11 +367,11 @@
}
private void setUpClient() {
+
eventsDb = new SQLClient(config);
localEventsDb = new SQLClient(config);
store =
new SQLStore(
- userProviderMock,
cfgMock,
eventsDb,
localEventsDb,
@@ -381,6 +379,7 @@
permissionBackendMock,
logCleanerMock,
PLUGIN_NAME);
+
store.start();
}
@@ -402,9 +401,9 @@
localEventsDb = mock(SQLClient.class);
when(localEventsDb.dbExists()).thenReturn(true);
when(localEventsDb.getAll()).thenReturn(ImmutableList.of(mock(SQLEntry.class)));
+
store =
new SQLStore(
- userProviderMock,
cfgMock,
eventsDb,
localEventsDb,
@@ -446,7 +445,6 @@
store =
new SQLStore(
- userProviderMock,
cfgMock,
eventsDb,
localEventsDb,
@@ -488,7 +486,7 @@
@Override
public ScheduledFuture<?> scheduleWithFixedDelay(
Runnable command, long initialDelay, long delay, TimeUnit unit) {
- log.info(command.toString());
+ log.atInfo().log(command.toString());
command.run();
return null;
}
diff --git a/tools/BUILD b/tools/BUILD
new file mode 100644
index 0000000..1fa2160
--- /dev/null
+++ b/tools/BUILD
@@ -0,0 +1 @@
+# Empty file - bazel treat directories with BUILD file as a package
\ No newline at end of file