Return ResourceNotFoundException when failing to open a git repository If we attempt to open a repository that does not exist, the exception thrown is eventually wrapped into a servlet exception with code 500. This is incorrect, as the response should actually be a 404. The first step therefore is to handle the exception by wrapping it into a rest ResourceNotFoundException. Bug: Issue 16730 Change-Id: If87f717012bf7f22ae31b12822e5453c711e3cdc
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/ApplyObjectCommand.java b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/ApplyObjectCommand.java index c268ba1..a083d77 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/ApplyObjectCommand.java +++ b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/api/ApplyObjectCommand.java
@@ -21,6 +21,7 @@ import com.google.common.flogger.FluentLogger; import com.google.gerrit.entities.Project; import com.google.gerrit.extensions.registration.DynamicItem; +import com.google.gerrit.extensions.restapi.ResourceNotFoundException; import com.google.gerrit.metrics.Timer1; import com.google.gerrit.server.events.EventDispatcher; import com.google.gerrit.server.permissions.PermissionBackendException; @@ -77,13 +78,15 @@ public void applyObject( Project.NameKey name, String refName, RevisionData revisionsData, String sourceLabel) - throws IOException, RefUpdateException, MissingParentObjectException { + throws IOException, RefUpdateException, MissingParentObjectException, + ResourceNotFoundException { applyObjects(name, refName, new RevisionData[] {revisionsData}, sourceLabel); } public void applyObjects( Project.NameKey name, String refName, RevisionData[] revisionsData, String sourceLabel) - throws IOException, RefUpdateException, MissingParentObjectException { + throws IOException, RefUpdateException, MissingParentObjectException, + ResourceNotFoundException { repLog.info( "Apply object from {} for {}:{} - {}",
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/fetch/ApplyObject.java b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/fetch/ApplyObject.java index 36356e9..3b6b0be 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/fetch/ApplyObject.java +++ b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/fetch/ApplyObject.java
@@ -15,6 +15,8 @@ package com.googlesource.gerrit.plugins.replication.pull.fetch; import com.google.gerrit.entities.Project; +import com.google.gerrit.extensions.restapi.IdString; +import com.google.gerrit.extensions.restapi.ResourceNotFoundException; import com.google.gerrit.server.git.GitRepositoryManager; import com.google.inject.Inject; import com.googlesource.gerrit.plugins.replication.pull.LocalGitRepositoryManagerProvider; @@ -22,6 +24,7 @@ import com.googlesource.gerrit.plugins.replication.pull.api.data.RevisionObjectData; import com.googlesource.gerrit.plugins.replication.pull.api.exception.MissingParentObjectException; import java.io.IOException; +import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectInserter; import org.eclipse.jgit.lib.RefUpdate; @@ -43,7 +46,7 @@ } public RefUpdateState apply(Project.NameKey name, RefSpec refSpec, RevisionData[] revisionsData) - throws MissingParentObjectException, IOException { + throws MissingParentObjectException, IOException, ResourceNotFoundException { try (Repository git = gitManager.openRepository(name)) { ObjectId refHead = null; @@ -87,6 +90,8 @@ RefUpdate.Result result = ru.update(); return new RefUpdateState(refSpec.getSource(), result); } + } catch (RepositoryNotFoundException e) { + throw new ResourceNotFoundException(IdString.fromDecoded(name.get())); } } }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/api/ApplyObjectActionTest.java b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/api/ApplyObjectActionTest.java index 814ba76..03e3db8 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/api/ApplyObjectActionTest.java +++ b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/api/ApplyObjectActionTest.java
@@ -26,6 +26,7 @@ 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.extensions.restapi.ResourceNotFoundException; import com.google.gerrit.extensions.restapi.Response; import com.google.gerrit.extensions.restapi.RestApiException; import com.google.gerrit.server.project.ProjectResource; @@ -201,6 +202,18 @@ applyObjectAction.apply(projectResource, inputParams); } + @Test(expected = ResourceNotFoundException.class) + public void shouldRethrowResourceNotFoundException() + throws RestApiException, IOException, RefUpdateException, MissingParentObjectException { + RevisionInput inputParams = new RevisionInput(label, refName, createSampleRevisionData()); + + doThrow(new ResourceNotFoundException("test_projects")) + .when(applyObjectCommand) + .applyObject(any(), anyString(), any(), anyString()); + + applyObjectAction.apply(projectResource, inputParams); + } + private RevisionData createSampleRevisionData() { RevisionObjectData commitData = new RevisionObjectData(
diff --git a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/api/ApplyObjectCommandTest.java b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/api/ApplyObjectCommandTest.java index 4c188df..5bdfd9f 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/replication/pull/api/ApplyObjectCommandTest.java +++ b/src/test/java/com/googlesource/gerrit/plugins/replication/pull/api/ApplyObjectCommandTest.java
@@ -24,6 +24,7 @@ import com.google.gerrit.entities.Project; import com.google.gerrit.entities.Project.NameKey; import com.google.gerrit.extensions.registration.DynamicItem; +import com.google.gerrit.extensions.restapi.ResourceNotFoundException; import com.google.gerrit.metrics.Timer1; import com.google.gerrit.server.events.Event; import com.google.gerrit.server.events.EventDispatcher; @@ -78,7 +79,9 @@ private ApplyObjectCommand objectUnderTest; @Before - public void setup() throws MissingParentObjectException, IOException, URISyntaxException { + public void setup() + throws MissingParentObjectException, IOException, URISyntaxException, + ResourceNotFoundException { RefUpdateState state = new RefUpdateState(TEST_REMOTE_NAME, RefUpdate.Result.NEW); TEST_REMOTE_URI = new URIish("git://some.remote.uri"); when(eventDispatcherDataItem.get()).thenReturn(eventDispatcher); @@ -96,7 +99,7 @@ @Test public void shouldSendEventWhenApplyObject() throws PermissionBackendException, IOException, RefUpdateException, - MissingParentObjectException { + MissingParentObjectException, ResourceNotFoundException { objectUnderTest.applyObject( TEST_PROJECT_NAME, TEST_REF_NAME, createSampleRevisionData(), TEST_SOURCE_LABEL);