Trigger replication and hooks on image upload/deletion

Change-Id: I3022ce2ef20b164360c161729bb4b049d8ce0709
Signed-off-by: Edwin Kempin <edwin.kempin@sap.com>
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/DeleteImage.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/DeleteImage.java
index ff9cfb5..6446e2a 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/DeleteImage.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/DeleteImage.java
@@ -14,12 +14,16 @@
 
 package com.googlesource.gerrit.plugins.imagare;
 
+import com.google.gerrit.common.ChangeHooks;
 import com.google.gerrit.extensions.restapi.AuthException;
 import com.google.gerrit.extensions.restapi.ResourceConflictException;
 import com.google.gerrit.extensions.restapi.Response;
 import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
 import com.google.gerrit.server.git.GitRepositoryManager;
 import com.google.inject.Inject;
+import com.google.inject.Provider;
 
 import com.googlesource.gerrit.plugins.imagare.DeleteImage.Input;
 
@@ -37,11 +41,19 @@
   public static class Input {
   }
 
+  private final Provider<IdentifiedUser> self;
   private final GitRepositoryManager repoManager;
+  private final GitReferenceUpdated referenceUpdated;
+  private final ChangeHooks hooks;
 
   @Inject
-  public DeleteImage(GitRepositoryManager repoManager) {
+  public DeleteImage(Provider<IdentifiedUser> self,
+      GitRepositoryManager repoManager, GitReferenceUpdated referenceUpdated,
+      ChangeHooks hooks) {
+    this.self = self;
     this.repoManager = repoManager;
+    this.referenceUpdated = referenceUpdated;
+    this.hooks = hooks;
   }
 
   @Override
@@ -70,6 +82,8 @@
         case NO_CHANGE:
         case FAST_FORWARD:
         case FORCED:
+          referenceUpdated.fire(rsrc.getProject(), u);
+          hooks.doRefUpdatedHook(rsrc.getBranchKey(), u, self.get().getAccount());
           break;
 
         case REJECTED_CURRENT_BRANCH:
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/ImageResource.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/ImageResource.java
index b76f013..131ae51 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/ImageResource.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/ImageResource.java
@@ -16,6 +16,7 @@
 
 import com.google.gerrit.extensions.restapi.RestResource;
 import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.reviewdb.client.Branch;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.server.project.RefControl;
 import com.google.inject.TypeLiteral;
@@ -41,4 +42,8 @@
   public String getRef() {
     return refControl.getRefName();
   }
+
+  public Branch.NameKey getBranchKey() {
+    return new Branch.NameKey(getProject(), getRef());
+  }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/PostImage.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/PostImage.java
index 5abfc5c..a669271 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/PostImage.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/PostImage.java
@@ -14,17 +14,20 @@
 
 package com.googlesource.gerrit.plugins.imagare;
 
+import com.google.gerrit.common.ChangeHooks;
 import com.google.gerrit.extensions.restapi.AuthException;
 import com.google.gerrit.extensions.restapi.BadRequestException;
 import com.google.gerrit.extensions.restapi.IdString;
 import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
 import com.google.gerrit.extensions.restapi.Response;
 import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.reviewdb.client.Branch;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.server.FileTypeRegistry;
 import com.google.gerrit.server.GerritPersonIdent;
 import com.google.gerrit.server.IdentifiedUser;
 import com.google.gerrit.server.config.CanonicalWebUrl;
+import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
 import com.google.gerrit.server.git.GitRepositoryManager;
 import com.google.gerrit.server.project.ProjectControl;
 import com.google.gerrit.server.project.ProjectResource;
@@ -64,17 +67,22 @@
   private final Pattern imageDataPattern;
   private final Provider<IdentifiedUser> self;
   private final GitRepositoryManager repoManager;
+  private final GitReferenceUpdated referenceUpdated;
+  private final ChangeHooks hooks;
   private final PersonIdent myIdent;
   private final String canonicalWebUrl;
 
   @Inject
   public PostImage(FileTypeRegistry registry, Provider<IdentifiedUser> self,
-      GitRepositoryManager repoManager, @GerritPersonIdent PersonIdent myIdent,
+      GitRepositoryManager repoManager, GitReferenceUpdated referenceUpdated,
+      ChangeHooks hooks, @GerritPersonIdent PersonIdent myIdent,
       @CanonicalWebUrl String canonicalWebUrl) {
     this.registry = registry;
     this.imageDataPattern = Pattern.compile("data:([\\w/.-]+);([\\w]+),(.*)");
     this.self = self;
     this.repoManager = repoManager;
+    this.referenceUpdated = referenceUpdated;
+    this.hooks = hooks;
     this.myIdent = myIdent;
     this.canonicalWebUrl = canonicalWebUrl;
   }
@@ -177,7 +185,11 @@
           ru.setExpectedOldObjectId(ObjectId.zeroId());
           ru.setNewObjectId(commitId);
           ru.disableRefLog();
-          if (ru.update(rw) != RefUpdate.Result.NEW) {
+          if (ru.update(rw) == RefUpdate.Result.NEW) {
+            referenceUpdated.fire(pc.getProject().getNameKey(), ru);
+            hooks.doRefUpdatedHook(new Branch.NameKey(pc.getProject()
+                .getNameKey(), ref), ru, self.get().getAccount());
+          } else {
             throw new IOException(String.format(
                 "Failed to create ref %s in %s: %s", ref,
                 pc.getProject().getName(), ru.getResult()));