Added backup branch creation for deleted refs

Change-Id: I2e1c4ad18a525c5f39c247e9c11d5f376b5f30b3
diff --git a/src/main/java/com/googlesource/gerrit/plugins/refprotection/RefUpdateListener.java b/src/main/java/com/googlesource/gerrit/plugins/refprotection/RefUpdateListener.java
index 92b6527..ebfca25 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/refprotection/RefUpdateListener.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/refprotection/RefUpdateListener.java
@@ -4,15 +4,40 @@
 import static org.eclipse.jgit.lib.Constants.R_TAGS;
 
 import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
+import com.google.gerrit.extensions.restapi.AuthException;
+import com.google.gerrit.extensions.restapi.BadRequestException;
+import com.google.gerrit.extensions.restapi.ResourceConflictException;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.project.CreateBranch;
+import com.google.gerrit.server.project.NoSuchProjectException;
+import com.google.gerrit.server.project.ProjectControl;
+import com.google.gerrit.server.project.ProjectResource;
+import com.google.inject.Inject;
 
 import org.eclipse.jgit.lib.ObjectId;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
 class RefUpdateListener implements GitReferenceUpdatedListener {
 
   private static final Logger log = LoggerFactory
       .getLogger(RefUpdateListener.class);
+  private final CreateBranch.Factory createBranchFactory;
+  private final ProjectControl.GenericFactory projectControl;
+  private final CurrentUser user;
+
+  @Inject
+  RefUpdateListener(CreateBranch.Factory createBranchFactory,
+      ProjectControl.GenericFactory p, CurrentUser user) {
+    this.createBranchFactory = createBranchFactory;
+    this.projectControl = p;
+    this.user = user;
+  }
 
   @Override
   public void onGitReferenceUpdated(final Event event) {
@@ -29,7 +54,31 @@
    * @param event the Event
    */
   private void createBackupBranch(Event event) {
-    // TODO
+    String branchName = event.getRefName().replaceFirst(R_HEADS, "");
+    try {
+      String branchPrefix = "";
+      int n = branchName.lastIndexOf("/");
+      if (n != -1) {
+        branchPrefix = branchName.substring(0, n + 1);
+        branchName = branchName.substring(n + 1);
+      }
+
+      String ref =
+          String.format("%sbackup-%s-%s", branchPrefix, branchName,
+              new SimpleDateFormat("YYYYMMdd-HHmmss").format(new Date()));
+
+      CreateBranch.Input input = new CreateBranch.Input();
+      input.ref = ref;
+      input.revision = event.getOldObjectId();
+      Project.NameKey nameKey = new Project.NameKey(event.getProjectName());
+      ProjectResource project =
+          new ProjectResource(projectControl.controlFor(nameKey, user));
+
+      createBranchFactory.create(ref).apply(project, input);
+    } catch (BadRequestException | AuthException | ResourceConflictException
+        | IOException | NoSuchProjectException e) {
+      log.error(e.getMessage(), e);
+    }
   }
 
   /**