Fix default file name for code owner configs if file extension is configured

AbstractFileBasedCodeOwnerBackend#getFileName uses ProjectCache to
check whether the project exists since trying to get the code-owners
plugin configuration for a non-existing project throws an exception.

Bug: Google b/302720443
Change-Id: I65818e7dd875bf4a370e9ce49a87103d55eef0f5
Signed-off-by: Edwin Kempin <ekempin@google.com>
diff --git a/java/com/google/gerrit/plugins/codeowners/backend/AbstractFileBasedCodeOwnerBackend.java b/java/com/google/gerrit/plugins/codeowners/backend/AbstractFileBasedCodeOwnerBackend.java
index 0be6cce..5dc8c9c 100644
--- a/java/com/google/gerrit/plugins/codeowners/backend/AbstractFileBasedCodeOwnerBackend.java
+++ b/java/com/google/gerrit/plugins/codeowners/backend/AbstractFileBasedCodeOwnerBackend.java
@@ -31,6 +31,7 @@
 import com.google.gerrit.server.IdentifiedUser;
 import com.google.gerrit.server.git.GitRepositoryManager;
 import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.project.ProjectCache;
 import com.google.gerrit.server.update.RetryHelper;
 import com.google.gerrit.server.update.context.RefUpdateContext;
 import java.io.IOException;
@@ -55,6 +56,7 @@
 
   private final CodeOwnersPluginConfiguration codeOwnersPluginConfiguration;
   private final GitRepositoryManager repoManager;
+  private final ProjectCache projectCache;
   private final PersonIdent serverIdent;
   private final MetaDataUpdate.InternalFactory metaDataUpdateInternalFactory;
   private final RetryHelper retryHelper;
@@ -65,6 +67,7 @@
   protected AbstractFileBasedCodeOwnerBackend(
       CodeOwnersPluginConfiguration codeOwnersPluginConfiguration,
       GitRepositoryManager repoManager,
+      ProjectCache projectCache,
       @GerritPersonIdent PersonIdent serverIdent,
       MetaDataUpdate.InternalFactory metaDataUpdateInternalFactory,
       RetryHelper retryHelper,
@@ -73,6 +76,7 @@
       CodeOwnerConfigParser codeOwnerConfigParser) {
     this.codeOwnersPluginConfiguration = codeOwnersPluginConfiguration;
     this.repoManager = repoManager;
+    this.projectCache = projectCache;
     this.serverIdent = serverIdent;
     this.metaDataUpdateInternalFactory = metaDataUpdateInternalFactory;
     this.retryHelper = retryHelper;
@@ -132,7 +136,7 @@
 
   @Override
   public Path getFilePath(CodeOwnerConfig.Key codeOwnerConfigKey) {
-    return codeOwnerConfigKey.filePath(defaultFileName);
+    return codeOwnerConfigKey.filePath(getFileName(codeOwnerConfigKey.project()));
   }
 
   @Override
@@ -191,9 +195,13 @@
 
   private String getFileName(Project.NameKey project) {
     return defaultFileName
-        + codeOwnersPluginConfiguration
-            .getProjectConfig(project)
-            .getFileExtension()
+        + projectCache
+            .get(project)
+            .flatMap(
+                projectState ->
+                    codeOwnersPluginConfiguration
+                        .getProjectConfig(projectState.getNameKey())
+                        .getFileExtension())
             .map(ext -> "." + ext)
             .orElse("");
   }
@@ -254,11 +262,10 @@
                   codeOwnerConfigKey)
               .setCodeOwnerConfigUpdate(codeOwnerConfigUpdate);
 
-      try (
-          RefUpdateContext pluginCtx = RefUpdateContext.open(PLUGIN);
+      try (RefUpdateContext pluginCtx = RefUpdateContext.open(PLUGIN);
           RefUpdateContext ctx = RefUpdateContext.open(VERSIONED_META_DATA_CHANGE);
           MetaDataUpdate metaDataUpdate =
-          createMetaDataUpdate(codeOwnerConfigKey.project(), repository, currentUser)) {
+              createMetaDataUpdate(codeOwnerConfigKey.project(), repository, currentUser)) {
         codeOwnerConfigFile.commit(metaDataUpdate);
       }
 
diff --git a/java/com/google/gerrit/plugins/codeowners/backend/findowners/FindOwnersBackend.java b/java/com/google/gerrit/plugins/codeowners/backend/findowners/FindOwnersBackend.java
index 513bd12..941a31c 100644
--- a/java/com/google/gerrit/plugins/codeowners/backend/findowners/FindOwnersBackend.java
+++ b/java/com/google/gerrit/plugins/codeowners/backend/findowners/FindOwnersBackend.java
@@ -23,6 +23,7 @@
 import com.google.gerrit.server.GerritPersonIdent;
 import com.google.gerrit.server.git.GitRepositoryManager;
 import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.project.ProjectCache;
 import com.google.gerrit.server.update.RetryHelper;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
@@ -47,12 +48,14 @@
       CodeOwnerConfigFile.Factory codeOwnerConfigFileFactory,
       FindOwnersCodeOwnerConfigParser codeOwnerConfigParser,
       GitRepositoryManager repoManager,
+      ProjectCache projectCache,
       @GerritPersonIdent PersonIdent serverIdent,
       MetaDataUpdate.InternalFactory metaDataUpdateInternalFactory,
       RetryHelper retryHelper) {
     super(
         codeOwnersPluginConfiguration,
         repoManager,
+        projectCache,
         serverIdent,
         metaDataUpdateInternalFactory,
         retryHelper,
diff --git a/java/com/google/gerrit/plugins/codeowners/backend/proto/ProtoBackend.java b/java/com/google/gerrit/plugins/codeowners/backend/proto/ProtoBackend.java
index ccb59df..a761bf6 100644
--- a/java/com/google/gerrit/plugins/codeowners/backend/proto/ProtoBackend.java
+++ b/java/com/google/gerrit/plugins/codeowners/backend/proto/ProtoBackend.java
@@ -23,6 +23,7 @@
 import com.google.gerrit.server.GerritPersonIdent;
 import com.google.gerrit.server.git.GitRepositoryManager;
 import com.google.gerrit.server.git.meta.MetaDataUpdate;
+import com.google.gerrit.server.project.ProjectCache;
 import com.google.gerrit.server.update.RetryHelper;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
@@ -49,6 +50,7 @@
   ProtoBackend(
       CodeOwnersPluginConfiguration codeOwnersPluginConfiguration,
       GitRepositoryManager repoManager,
+      ProjectCache projectCache,
       @GerritPersonIdent PersonIdent serverIdent,
       MetaDataUpdate.InternalFactory metaDataUpdateInternalFactory,
       RetryHelper retryHelper,
@@ -57,6 +59,7 @@
     super(
         codeOwnersPluginConfiguration,
         repoManager,
+        projectCache,
         serverIdent,
         metaDataUpdateInternalFactory,
         retryHelper,
diff --git a/javatests/com/google/gerrit/plugins/codeowners/acceptance/api/AbstractGetCodeOwnersForPathIT.java b/javatests/com/google/gerrit/plugins/codeowners/acceptance/api/AbstractGetCodeOwnersForPathIT.java
index 1ca5fd9..69bcd30 100644
--- a/javatests/com/google/gerrit/plugins/codeowners/acceptance/api/AbstractGetCodeOwnersForPathIT.java
+++ b/javatests/com/google/gerrit/plugins/codeowners/acceptance/api/AbstractGetCodeOwnersForPathIT.java
@@ -1925,4 +1925,32 @@
             unresolvableCodeOwnerConfigReference.importMode(),
             String.format("project %s not found", nonExistingProject));
   }
+
+  @Test
+  @GerritConfig(name = "plugin.code-owners.fileExtension", value = "foo")
+  public void returnedOwnersFileContainsFileExtension() throws Exception {
+    CodeOwnerConfig.Key codeOwnerConfigKey =
+        codeOwnerConfigOperations
+            .newCodeOwnerConfig()
+            .project(project)
+            .branch("master")
+            .folderPath("/")
+            .fileName(getCodeOwnerConfigFileName() + ".foo")
+            .addCodeOwnerEmail(admin.email())
+            .create();
+
+    CodeOwnersInfo codeOwnersInfo = queryCodeOwners("foo/bar/baz.md");
+    assertThat(codeOwnersInfo)
+        .hasCodeOwnersThat()
+        .comparingElementsUsing(hasAccountId())
+        .containsExactly(admin.id());
+
+    assertThat(codeOwnersInfo.codeOwnerConfigs).hasSize(1);
+    CodeOwnerConfigFileInfo codeOwnerConfigFileInfo = codeOwnersInfo.codeOwnerConfigs.get(0);
+    assertThat(codeOwnerConfigFileInfo)
+        .assertKey(backend, codeOwnerConfigKey)
+        .assertNoImports()
+        .assertNoImportMode()
+        .assertNoUnresolvedErrorMessage();
+  }
 }