Do not fail import if hashtags cannot be set due to missing permissions

Log a warning when hashtags cannot be set because the importing user
does not have the 'Edit Hashtags' global capability and then continue
the import. After assigning the capability the import can be resumed
(with force flag) to import the hashtags.

Change-Id: Ia329d0083bdb077b8ff7384fd400e1a0535a2f84
Signed-off-by: Edwin Kempin <edwin.kempin@sap.com>
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/AddHashtagsStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/AddHashtagsStep.java
index f3bf629..f8aaef9 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/AddHashtagsStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/AddHashtagsStep.java
@@ -14,11 +14,13 @@
 
 package com.googlesource.gerrit.plugins.importer;
 
+import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.api.changes.HashtagsInput;
 import com.google.gerrit.extensions.common.ChangeInfo;
 import com.google.gerrit.extensions.restapi.AuthException;
 import com.google.gerrit.reviewdb.client.Change;
 import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.change.ChangeTriplet;
 import com.google.gerrit.server.change.HashtagsUtil;
 import com.google.gerrit.server.project.ChangeControl;
 import com.google.gerrit.server.project.NoSuchChangeException;
@@ -27,6 +29,9 @@
 import com.google.inject.Inject;
 import com.google.inject.assistedinject.Assisted;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.io.IOException;
 import java.util.HashSet;
 
@@ -36,9 +41,13 @@
     AddHashtagsStep create(Change change, ChangeInfo changeInfo, boolean resume);
   }
 
+  private static final Logger log = LoggerFactory
+      .getLogger(AddHashtagsStep.class);
+
   private final HashtagsUtil hashtagsUtil;
   private final CurrentUser currentUser;
   private final ChangeControl.GenericFactory changeControlFactory;
+  private final String pluginName;
   private final Change change;
   private final ChangeInfo changeInfo;
   private final boolean resume;
@@ -47,14 +56,16 @@
   AddHashtagsStep(HashtagsUtil hashtagsUtil,
       CurrentUser currentUser,
       ChangeControl.GenericFactory changeControlFactory,
+      @PluginName String pluginName,
       @Assisted Change change,
       @Assisted ChangeInfo changeInfo,
       @Assisted boolean resume) {
     this.hashtagsUtil = hashtagsUtil;
-    this.change = change;
-    this.changeInfo = changeInfo;
     this.currentUser = currentUser;
     this.changeControlFactory = changeControlFactory;
+    this.pluginName = pluginName;
+    this.change = change;
+    this.changeInfo = changeInfo;
     this.resume = resume;
   }
 
@@ -62,14 +73,23 @@
       ValidationException, OrmException, NoSuchChangeException {
     ChangeControl ctrl = changeControlFactory.controlFor(change, currentUser);
 
-    if (resume) {
-      HashtagsInput input = new HashtagsInput();
-      input.remove = ctrl.getNotes().load().getHashtags();
-      hashtagsUtil.setHashtags(ctrl, input, false, false);
-    }
+    try {
+      if (resume) {
+        HashtagsInput input = new HashtagsInput();
+        input.remove = ctrl.getNotes().load().getHashtags();
+        hashtagsUtil.setHashtags(ctrl, input, false, false);
+      }
 
-    HashtagsInput input = new HashtagsInput();
-    input.add = new HashSet<>(changeInfo.hashtags);
-    hashtagsUtil.setHashtags(ctrl, input, false, false);
+      HashtagsInput input = new HashtagsInput();
+      input.add = new HashSet<>(changeInfo.hashtags);
+      hashtagsUtil.setHashtags(ctrl, input, false, false);
+    } catch (AuthException e) {
+      log.warn(String.format(
+          "[%s] Hashtags cannot be set on change %s because the importing"
+              + " user %s doesn't have permissions to edit hashtags"
+              + " (e.g. assign the 'Edit Hashtags' global capability"
+              + " and resume the import with the force option).",
+          pluginName, ChangeTriplet.format(change), currentUser.getUserName()));
+    }
   }
 }