Merge "Remove ReviewDb related stuff only when ReviewDb is enable"
diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs
index 17904c0..1792fcc 100644
--- a/.settings/org.eclipse.jdt.core.prefs
+++ b/.settings/org.eclipse.jdt.core.prefs
@@ -1,9 +1,9 @@
 #Fri Jul 16 23:39:13 PDT 2010
 eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
-org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.source=1.7
+org.eclipse.jdt.core.compiler.source=1.8
 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
diff --git a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeleteLogLayout.java b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeleteLogLayout.java
index cc4c436..7797c6d 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeleteLogLayout.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeleteLogLayout.java
@@ -14,28 +14,17 @@
 
 package com.googlesource.gerrit.plugins.deleteproject;
 
-import java.text.SimpleDateFormat;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.TimeZone;
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
 import org.apache.log4j.Layout;
 import org.apache.log4j.spi.LoggingEvent;
 import org.eclipse.jgit.util.QuotedString;
 
 final class DeleteLogLayout extends Layout {
-  private final Calendar calendar;
-  private long lastTimeMillis;
-  private final char[] lastTimeString = new char[20];
-  private final char[] timeZone;
-
-  public DeleteLogLayout() {
-    TimeZone tz = TimeZone.getDefault();
-    calendar = Calendar.getInstance(tz);
-
-    SimpleDateFormat sdf = new SimpleDateFormat("Z");
-    sdf.setTimeZone(tz);
-    timeZone = sdf.format(new Date()).toCharArray();
-  }
+  private static final DateTimeFormatter DATE_FORMATTER =
+      DateTimeFormatter.ofPattern("'['yyyy-MM-dd HH:mm:ss,SSS xxxx']'");
 
   /**
    * Formats the events in the delete log.
@@ -51,11 +40,7 @@
   public String format(LoggingEvent event) {
     final StringBuffer buf = new StringBuffer(128);
 
-    buf.append('[');
-    formatDate(event.getTimeStamp(), buf);
-    buf.append(' ');
-    buf.append(timeZone);
-    buf.append(']');
+    buf.append(formatDate(event.getTimeStamp()));
 
     buf.append(' ');
     buf.append(event.getLevel().toString());
@@ -74,36 +59,9 @@
     return buf.toString();
   }
 
-  private void formatDate(final long now, final StringBuffer sbuf) {
-    final int millis = (int) (now % 1000);
-    final long rounded = now - millis;
-    if (rounded != lastTimeMillis) {
-      synchronized (calendar) {
-        final int start = sbuf.length();
-        calendar.setTimeInMillis(rounded);
-        sbuf.append(calendar.get(Calendar.YEAR));
-        sbuf.append('-');
-        sbuf.append(toTwoDigits(calendar.get(Calendar.MONTH) + 1));
-        sbuf.append('-');
-        sbuf.append(toTwoDigits(calendar.get(Calendar.DAY_OF_MONTH)));
-        sbuf.append(' ');
-        sbuf.append(toTwoDigits(calendar.get(Calendar.HOUR_OF_DAY)));
-        sbuf.append(':');
-        sbuf.append(toTwoDigits(calendar.get(Calendar.MINUTE)));
-        sbuf.append(':');
-        sbuf.append(toTwoDigits(calendar.get(Calendar.SECOND)));
-        sbuf.append(',');
-        sbuf.getChars(start, sbuf.length(), lastTimeString, 0);
-        lastTimeMillis = rounded;
-      }
-    } else {
-      sbuf.append(lastTimeString);
-    }
-    sbuf.append(String.format("%03d", millis));
-  }
-
-  private String toTwoDigits(int input) {
-    return String.format("%02d", input);
+  private String formatDate(long now) {
+    ZonedDateTime zdt = ZonedDateTime.ofInstant(Instant.ofEpochMilli(now), ZoneId.systemDefault());
+    return zdt.format(DATE_FORMATTER);
   }
 
   private void req(String key, StringBuffer buf, LoggingEvent event) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeleteProject.java b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeleteProject.java
index 85680d9..b2326ed 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeleteProject.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/DeleteProject.java
@@ -33,6 +33,7 @@
 import com.google.gerrit.server.notedb.NotesMigration;
 import com.google.gerrit.server.permissions.GlobalPermission;
 import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.ProjectPermission;
 import com.google.gerrit.server.project.ProjectResource;
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
@@ -120,10 +121,11 @@
 
   protected boolean canDelete(ProjectResource rsrc) {
     PermissionBackend.WithUser userPermission = permissionBackend.user(userProvider);
+    PermissionBackend.ForProject projectPermission = userPermission.project(rsrc.getNameKey());
     return userPermission.testOrFalse(GlobalPermission.ADMINISTRATE_SERVER)
         || userPermission.testOrFalse(new PluginPermission(pluginName, DELETE_PROJECT))
         || (userPermission.testOrFalse(new PluginPermission(pluginName, DELETE_OWN_PROJECT))
-            && rsrc.getControl().isOwner());
+            && projectPermission.testOrFalse(ProjectPermission.WRITE_CONFIG));
   }
 
   public void assertCanDelete(ProjectResource rsrc, Input input) throws ResourceConflictException {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/cache/CacheDeleteHandler.java b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/cache/CacheDeleteHandler.java
index bdf3ff5..574433f 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/cache/CacheDeleteHandler.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/cache/CacheDeleteHandler.java
@@ -18,6 +18,8 @@
 import com.google.gerrit.server.project.ProjectCache;
 import com.google.inject.Inject;
 
+import java.io.IOException;
+
 public class CacheDeleteHandler {
 
   private final ProjectCache projectCache;
@@ -27,7 +29,7 @@
     this.projectCache = projectCache;
   }
 
-  public void delete(Project project) {
+  public void delete(Project project) throws IOException {
     projectCache.remove(project);
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/fs/DeleteTrashFolders.java b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/fs/DeleteTrashFolders.java
index c645f7a..9aae37e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/fs/DeleteTrashFolders.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/fs/DeleteTrashFolders.java
@@ -114,22 +114,19 @@
   @Override
   public void start() {
     new Thread(
-            new Runnable() {
-              @Override
-              public void run() {
-                for (Path folder : repoFolders) {
-                  if (Files.notExists(folder)) {
-                    log.debug("Base path {} does not exist", folder);
-                    continue;
-                  }
-                  try {
-                    Files.walkFileTree(folder, new TrashFolderRemover());
-                  } catch (IOException e) {
-                    log.warn("Exception while trying to delete trash folders", e);
-                  }
-                }
-              }
-            },
+        () -> {
+          for (Path folder : repoFolders) {
+            if (!folder.toFile().exists()) {
+              log.debug("Base path {} does not exist", folder);
+              continue;
+            }
+            try {
+              Files.walkFileTree(folder, new TrashFolderRemover());
+            } catch (IOException e) {
+              log.warn("Exception while trying to delete trash folders", e);
+            }
+          }
+        },
             "DeleteTrashFolders")
         .start();
   }