Merge changes I9995b57f,I4e1b61ba

* changes:
  Allow to unignore own changes
  Ignore/Mute REST endpoints: Don't wrap OrmException in RestApiException
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java
index c62c9b5b..fe665a4 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java
@@ -662,10 +662,14 @@
   public void ignore(boolean ignore) throws RestApiException {
     // TODO(dborowitz): Convert to RetryingRestModifyView. Needs to plumb BatchUpdate.Factory into
     // StarredChangesUtil.
-    if (ignore) {
-      this.ignore.apply(change, new Ignore.Input());
-    } else {
-      unignore.apply(change, new Unignore.Input());
+    try {
+      if (ignore) {
+        this.ignore.apply(change, new Ignore.Input());
+      } else {
+        unignore.apply(change, new Unignore.Input());
+      }
+    } catch (OrmException e) {
+      throw asRestApiException("Cannot ignore change", e);
     }
   }
 
@@ -682,10 +686,14 @@
   public void mute(boolean mute) throws RestApiException {
     // TODO(dborowitz): Convert to RetryingRestModifyView. Needs to plumb BatchUpdate.Factory into
     // StarredChangesUtil.
-    if (mute) {
-      this.mute.apply(change, new Mute.Input());
-    } else {
-      unmute.apply(change, new Unmute.Input());
+    try {
+      if (mute) {
+        this.mute.apply(change, new Mute.Input());
+      } else {
+        unmute.apply(change, new Unmute.Input());
+      }
+    } catch (OrmException e) {
+      throw asRestApiException("Cannot mute change", e);
     }
   }
 
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Ignore.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Ignore.java
index b4143ff..11e31df 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Ignore.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Ignore.java
@@ -51,7 +51,8 @@
   }
 
   @Override
-  public Response<String> apply(ChangeResource rsrc, Input input) throws RestApiException {
+  public Response<String> apply(ChangeResource rsrc, Input input)
+      throws RestApiException, OrmException {
     try {
       if (rsrc.isUserOwner()) {
         throw new BadRequestException("cannot ignore own change");
@@ -63,8 +64,6 @@
       return Response.ok("");
     } catch (MutuallyExclusiveLabelsException e) {
       throw new ResourceConflictException(e.getMessage());
-    } catch (OrmException e) {
-      throw new RestApiException("failed to ignore change", e);
     }
   }
 
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Mute.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Mute.java
index d14fec8..c7e0603 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Mute.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Mute.java
@@ -52,16 +52,13 @@
   }
 
   @Override
-  public Response<String> apply(ChangeResource rsrc, Input input) throws RestApiException {
-    try {
-      if (rsrc.isUserOwner() || isMuted(rsrc.getChange())) {
-        // early exit for own changes and already muted changes
-        return Response.ok("");
-      }
-      stars.mute(self.get().getAccountId(), rsrc.getProject(), rsrc.getChange());
-    } catch (OrmException e) {
-      throw new RestApiException("failed to mute change", e);
+  public Response<String> apply(ChangeResource rsrc, Input input)
+      throws RestApiException, OrmException {
+    if (rsrc.isUserOwner() || isMuted(rsrc.getChange())) {
+      // early exit for own changes and already muted changes
+      return Response.ok("");
     }
+    stars.mute(self.get().getAccountId(), rsrc.getProject(), rsrc.getChange());
     return Response.ok("");
   }
 
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Unignore.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Unignore.java
index 2de3375..2179ec5f 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Unignore.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Unignore.java
@@ -44,24 +44,16 @@
     return new UiAction.Description()
         .setLabel("Unignore")
         .setTitle("Unignore the change")
-        .setVisible(canUnignore(rsrc));
+        .setVisible(isIgnored(rsrc));
   }
 
   @Override
-  public Response<String> apply(ChangeResource rsrc, Input input) throws RestApiException {
-    try {
-      // Don't try to unignore own changes or not ignored changes
-      if (canUnignore(rsrc)) {
-        stars.unignore(rsrc);
-      }
-      return Response.ok("");
-    } catch (OrmException e) {
-      throw new RestApiException("failed to unignore change", e);
+  public Response<String> apply(ChangeResource rsrc, Input input)
+      throws RestApiException, OrmException {
+    if (isIgnored(rsrc)) {
+      stars.unignore(rsrc);
     }
-  }
-
-  private boolean canUnignore(ChangeResource rsrc) {
-    return !rsrc.isUserOwner() && isIgnored(rsrc);
+    return Response.ok("");
   }
 
   private boolean isIgnored(ChangeResource rsrc) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Unmute.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Unmute.java
index 49b41cb..d50bd20 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Unmute.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Unmute.java
@@ -53,16 +53,13 @@
   }
 
   @Override
-  public Response<String> apply(ChangeResource rsrc, Input input) throws RestApiException {
-    try {
-      if (rsrc.isUserOwner() || !isMuted(rsrc.getChange())) {
-        // early exit for own changes and not muted changes
-        return Response.ok("");
-      }
-      stars.unmute(self.get().getAccountId(), rsrc.getProject(), rsrc.getChange());
-    } catch (OrmException e) {
-      throw new RestApiException("failed to unmute change", e);
+  public Response<String> apply(ChangeResource rsrc, Input input)
+      throws RestApiException, OrmException {
+    if (rsrc.isUserOwner() || !isMuted(rsrc.getChange())) {
+      // early exit for own changes and not muted changes
+      return Response.ok("");
     }
+    stars.unmute(self.get().getAccountId(), rsrc.getProject(), rsrc.getChange());
     return Response.ok("");
   }