Do not decode project name during filtering

The project name was assumed to be URL-encoded when passed
from the replication filtering API. The URL-decoding did not have any
side-effects for project names without special characters; however, it
caused projects to have a malformed name when it contained a '+'
which was decoded as a space.

Bug: Issue 15716
Change-Id: I4790bc6335706cbe9da66d14a8a6bdbd1a20cae2
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/MultisiteReplicationPushFilter.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/MultisiteReplicationPushFilter.java
index b85ec89..cbbc73c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/MultisiteReplicationPushFilter.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/MultisiteReplicationPushFilter.java
@@ -62,7 +62,7 @@
   public List<RemoteRefUpdate> filter(String projectName, List<RemoteRefUpdate> remoteUpdatesList) {
     Set<String> outdatedChanges = new HashSet<>();
     try (Repository repository =
-        gitRepositoryManager.openRepository(Project.NameKey.parse(projectName))) {
+        gitRepositoryManager.openRepository(new Project.NameKey(projectName))) {
       List<RemoteRefUpdate> filteredRefUpdates =
           remoteUpdatesList.stream()
               .filter(
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/MultisiteReplicationPushFilterTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/MultisiteReplicationPushFilterTest.java
index d6b92e4..5c3bff1 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/MultisiteReplicationPushFilterTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/MultisiteReplicationPushFilterTest.java
@@ -22,6 +22,7 @@
 import static org.mockito.Mockito.verify;
 
 import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.testing.InMemoryRepositoryManager;
 import com.google.gerrit.testing.InMemoryTestEnvironment;
 import com.google.inject.Inject;
@@ -59,14 +60,19 @@
 
   @Inject private InMemoryRepositoryManager gitRepositoryManager;
 
-  String project = A_TEST_PROJECT_NAME;
+  String project;
 
   private TestRepository<InMemoryRepository> repo;
 
+  @Override
   @Before
   public void setUp() throws Exception {
-    InMemoryRepository inMemoryRepo =
-        gitRepositoryManager.createRepository(A_TEST_PROJECT_NAME_KEY);
+    setUp(A_TEST_PROJECT_NAME, A_TEST_PROJECT_NAME_KEY);
+  }
+
+  private void setUp(String projectName, Project.NameKey projectNameKey) throws Exception {
+    project = projectName;
+    InMemoryRepository inMemoryRepo = gitRepositoryManager.createRepository(projectNameKey);
     repo = new TestRepository<>(inMemoryRepo);
   }
 
@@ -143,6 +149,19 @@
     assertThat(filteredRefUpdates).containsExactly(refUpToDate, refChangeUpToDate);
   }
 
+  @Test
+  public void shouldFilterProjectNameEndingWithPlus() throws Exception {
+    setUp("testrepo+", new Project.NameKey("testrepo+"));
+    RemoteRefUpdate refUpdate = refUpdate("refs/heads/foo");
+    doReturn(true).when(sharedRefDatabaseMock).isUpToDate(eq(project), any());
+
+    MultisiteReplicationPushFilter pushFilter =
+        new MultisiteReplicationPushFilter(sharedRefDatabaseMock, gitRepositoryManager);
+    List<RemoteRefUpdate> filteredRefUpdates = pushFilter.filter(project, Arrays.asList(refUpdate));
+
+    assertThat(filteredRefUpdates).contains(refUpdate);
+  }
+
   private SharedRefDatabaseWrapper newSharedRefDatabase(String... rejectedRefs) {
     Set<String> rejectedSet = new HashSet<>();
     rejectedSet.addAll(Arrays.asList(rejectedRefs));