Merge "Perform group lookups by name from the group index"
diff --git a/src/main/java/com/googlesource/gerrit/plugins/uploadvalidator/ValidatorConfig.java b/src/main/java/com/googlesource/gerrit/plugins/uploadvalidator/ValidatorConfig.java
index ea2e556..ef0030f 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/uploadvalidator/ValidatorConfig.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/uploadvalidator/ValidatorConfig.java
@@ -20,26 +20,28 @@
 import com.google.gerrit.reviewdb.client.AccountGroup;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.GroupCache;
 import com.google.gerrit.server.config.PluginConfig;
 import com.google.gerrit.server.config.ProjectConfigEntry;
+import com.google.gerrit.server.group.InternalGroup;
 import com.google.gerrit.server.project.RefPatternMatcher;
+import com.google.gerrit.server.query.group.InternalGroupQuery;
+import com.google.gwtorm.server.OrmException;
 import com.google.inject.AbstractModule;
 import com.google.inject.Inject;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
+import com.google.inject.Provider;
 import java.util.Arrays;
+import java.util.Optional;
 import java.util.regex.Pattern;
 import java.util.stream.Stream;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class ValidatorConfig {
   private static final Logger log = LoggerFactory.getLogger(ValidatorConfig.class);
   private static final String KEY_PROJECT = "project";
   private static final String KEY_REF = "ref";
   private final ConfigFactory configFactory;
-  private final GroupCache groupCache;
+  private final GroupByNameFinder groupByNameFinder;
 
   public static AbstractModule module() {
     return new AbstractModule() {
@@ -65,14 +67,15 @@
                     null,
                     false,
                     "Only refs that match this regex will be validated."));
+        bind(GroupByNameFinder.class).to(GroupByNameFromIndexFinder.class);
       }
     };
   }
 
   @Inject
-  public ValidatorConfig(ConfigFactory configFactory, GroupCache groupCache) {
+  public ValidatorConfig(ConfigFactory configFactory, GroupByNameFinder groupByNameFinder) {
     this.configFactory = configFactory;
-    this.groupCache = groupCache;
+    this.groupByNameFinder = groupByNameFinder;
   }
 
   public boolean isEnabledForRef(
@@ -165,10 +168,32 @@
   }
 
   private AccountGroup.UUID groupUUID(String groupNameOrUUID) {
-    AccountGroup group = groupCache.get(new AccountGroup.NameKey(groupNameOrUUID));
-    if (group == null) {
-      return new AccountGroup.UUID(groupNameOrUUID);
+    Optional<InternalGroup> group =
+        groupByNameFinder.get(new AccountGroup.NameKey(groupNameOrUUID));
+    return group.map(InternalGroup::getGroupUUID).orElse(new AccountGroup.UUID(groupNameOrUUID));
+  }
+
+  interface GroupByNameFinder {
+    Optional<InternalGroup> get(AccountGroup.NameKey groupName);
+  }
+
+  static class GroupByNameFromIndexFinder implements GroupByNameFinder {
+
+    private final Provider<InternalGroupQuery> groupQueryProvider;
+
+    @Inject
+    GroupByNameFromIndexFinder(Provider<InternalGroupQuery> groupQueryProvider) {
+      this.groupQueryProvider = groupQueryProvider;
     }
-    return group.getGroupUUID();
+
+    @Override
+    public Optional<InternalGroup> get(AccountGroup.NameKey groupName) {
+      try {
+        return groupQueryProvider.get().byName(groupName);
+      } catch (OrmException e) {
+        log.warn(String.format("Cannot lookup group %s by name", groupName.get()), e);
+      }
+      return Optional.empty();
+    }
   }
 }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/uploadvalidator/EmailAwareValidatorConfigTest.java b/src/test/java/com/googlesource/gerrit/plugins/uploadvalidator/EmailAwareValidatorConfigTest.java
index bdf3c0f..b385259 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/uploadvalidator/EmailAwareValidatorConfigTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/uploadvalidator/EmailAwareValidatorConfigTest.java
@@ -18,7 +18,6 @@
 
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.server.IdentifiedUser;
-
 import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.junit.Test;
 
@@ -109,9 +108,7 @@
   }
 
   private ValidatorConfig getConfig(String defaultConfig) throws ConfigInvalidException {
-    ValidatorConfig config =
-        new ValidatorConfig(
-            new FakeConfigFactory(projectName, defaultConfig), new FakeGroupCacheUUIDByName());
-    return config;
+    return new ValidatorConfig(
+        new FakeConfigFactory(projectName, defaultConfig), new FakeGroupByNameFinder());
   }
 }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/uploadvalidator/FakeGroupByNameFinder.java b/src/test/java/com/googlesource/gerrit/plugins/uploadvalidator/FakeGroupByNameFinder.java
new file mode 100644
index 0000000..69f1b74
--- /dev/null
+++ b/src/test/java/com/googlesource/gerrit/plugins/uploadvalidator/FakeGroupByNameFinder.java
@@ -0,0 +1,40 @@
+// Copyright (C) 2017 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.googlesource.gerrit.plugins.uploadvalidator;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.server.group.InternalGroup;
+import java.util.Objects;
+import java.util.Optional;
+
+public class FakeGroupByNameFinder implements ValidatorConfig.GroupByNameFinder {
+
+  private final Optional<InternalGroup> onlyGroup;
+
+  public FakeGroupByNameFinder() {
+    onlyGroup = Optional.empty();
+  }
+
+  public FakeGroupByNameFinder(AccountGroup accountGroup) {
+    onlyGroup =
+        Optional.of(InternalGroup.create(accountGroup, ImmutableSet.of(), ImmutableSet.of()));
+  }
+
+  @Override
+  public Optional<InternalGroup> get(AccountGroup.NameKey groupName) {
+    return onlyGroup.filter(group -> Objects.equals(group.getNameKey(), groupName));
+  }
+}
diff --git a/src/test/java/com/googlesource/gerrit/plugins/uploadvalidator/FakeGroupCacheUUIDByName.java b/src/test/java/com/googlesource/gerrit/plugins/uploadvalidator/FakeGroupCacheUUIDByName.java
deleted file mode 100644
index 00fef07..0000000
--- a/src/test/java/com/googlesource/gerrit/plugins/uploadvalidator/FakeGroupCacheUUIDByName.java
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright (C) 2017 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.googlesource.gerrit.plugins.uploadvalidator;
-
-import com.google.common.collect.ImmutableList;
-import com.google.gerrit.reviewdb.client.AccountGroup;
-import com.google.gerrit.reviewdb.client.AccountGroup.Id;
-import com.google.gerrit.reviewdb.client.AccountGroup.NameKey;
-import com.google.gerrit.reviewdb.client.AccountGroup.UUID;
-import com.google.gerrit.server.account.GroupCache;
-import com.google.gerrit.server.group.InternalGroup;
-import java.util.Optional;
-
-public class FakeGroupCacheUUIDByName implements GroupCache {
-  private AccountGroup accountGroup;
-
-  public FakeGroupCacheUUIDByName(AccountGroup accountGroup) {
-    this.accountGroup = accountGroup;
-  }
-
-  public FakeGroupCacheUUIDByName() {
-    // TODO Auto-generated constructor stub
-  }
-
-  @Override
-  public AccountGroup get(Id groupId) {
-    return null;
-  }
-
-  @Override
-  public AccountGroup get(NameKey name) {
-    return accountGroup != null && accountGroup.getNameKey().equals(name) ? accountGroup : null;
-  }
-
-  @Override
-  public Optional<InternalGroup> get(UUID uuid) {
-    return null;
-  }
-
-  @Override
-  public ImmutableList<AccountGroup> all() {
-    return null;
-  }
-
-  @Override
-  public void onCreateGroup(NameKey newGroupName) {}
-
-  @Override
-  public void evict(
-      AccountGroup.UUID groupUuid, AccountGroup.Id groupId, AccountGroup.NameKey groupName) {}
-
-  @Override
-  public void evictAfterRename(NameKey oldName, NameKey newName) {}
-}
diff --git a/src/test/java/com/googlesource/gerrit/plugins/uploadvalidator/ProjectAwareValidatorConfigTest.java b/src/test/java/com/googlesource/gerrit/plugins/uploadvalidator/ProjectAwareValidatorConfigTest.java
index 601fcf6..e6e1be7 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/uploadvalidator/ProjectAwareValidatorConfigTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/uploadvalidator/ProjectAwareValidatorConfigTest.java
@@ -18,7 +18,6 @@
 
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.server.IdentifiedUser;
-
 import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.junit.Test;
 
@@ -100,9 +99,7 @@
 
   private ValidatorConfig getConfig(String defaultConfig, Project.NameKey projName)
       throws ConfigInvalidException {
-    ValidatorConfig config =
-        new ValidatorConfig(
-            new FakeConfigFactory(projName, defaultConfig), new FakeGroupCacheUUIDByName());
-    return config;
+    return new ValidatorConfig(
+        new FakeConfigFactory(projName, defaultConfig), new FakeGroupByNameFinder());
   }
 }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/uploadvalidator/RefAwareValidatorConfigTest.java b/src/test/java/com/googlesource/gerrit/plugins/uploadvalidator/RefAwareValidatorConfigTest.java
index ac4094f..acc2bdc 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/uploadvalidator/RefAwareValidatorConfigTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/uploadvalidator/RefAwareValidatorConfigTest.java
@@ -18,7 +18,6 @@
 
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.server.IdentifiedUser;
-
 import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.junit.Test;
 
@@ -105,9 +104,7 @@
   }
 
   private ValidatorConfig getConfig(String defaultConfig) throws ConfigInvalidException {
-    ValidatorConfig config =
-        new ValidatorConfig(
-            new FakeConfigFactory(projectName, defaultConfig), new FakeGroupCacheUUIDByName());
-    return config;
+    return new ValidatorConfig(
+        new FakeConfigFactory(projectName, defaultConfig), new FakeGroupByNameFinder());
   }
 }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/uploadvalidator/SkipValidationTest.java b/src/test/java/com/googlesource/gerrit/plugins/uploadvalidator/SkipValidationTest.java
index f7ed871..4942391 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/uploadvalidator/SkipValidationTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/uploadvalidator/SkipValidationTest.java
@@ -29,7 +29,7 @@
   @Test
   public void dontSkipByDefault() throws Exception {
     ValidatorConfig validatorConfig =
-        new ValidatorConfig(new FakeConfigFactory(projectName, ""), new FakeGroupCacheUUIDByName());
+        new ValidatorConfig(new FakeConfigFactory(projectName, ""), new FakeGroupByNameFinder());
 
     assertThat(validatorConfig.isEnabledForRef(anyUser, projectName, "anyRef", "anyOp")).isTrue();
   }
@@ -44,7 +44,7 @@
 
     ValidatorConfig validatorConfig =
         new ValidatorConfig(
-            new FakeConfigFactory(projectName, config), new FakeGroupCacheUUIDByName());
+            new FakeConfigFactory(projectName, config), new FakeGroupByNameFinder());
 
     assertThat(
             validatorConfig.isEnabledForRef(
@@ -63,7 +63,7 @@
     ValidatorConfig validatorConfig =
         new ValidatorConfig(
             new FakeConfigFactory(projectName, config),
-            new FakeGroupCacheUUIDByName(
+            new FakeGroupByNameFinder(
                 new AccountGroup(
                     new AccountGroup.NameKey("testGroupName"),
                     new AccountGroup.Id(1),
@@ -86,7 +86,7 @@
 
     ValidatorConfig validatorConfig =
         new ValidatorConfig(
-            new FakeConfigFactory(projectName, config), new FakeGroupCacheUUIDByName());
+            new FakeConfigFactory(projectName, config), new FakeGroupByNameFinder());
 
     assertThat(
             validatorConfig.isEnabledForRef(
@@ -104,7 +104,7 @@
 
     ValidatorConfig validatorConfig =
         new ValidatorConfig(
-            new FakeConfigFactory(projectName, config), new FakeGroupCacheUUIDByName());
+            new FakeConfigFactory(projectName, config), new FakeGroupByNameFinder());
 
     assertThat(validatorConfig.isEnabledForRef(anyUser, projectName, "anyRef", "anotherOp"))
         .isTrue();
@@ -120,7 +120,7 @@
 
     ValidatorConfig validatorConfig =
         new ValidatorConfig(
-            new FakeConfigFactory(projectName, config), new FakeGroupCacheUUIDByName());
+            new FakeConfigFactory(projectName, config), new FakeGroupByNameFinder());
 
     assertThat(
             validatorConfig.isEnabledForRef(
@@ -138,7 +138,7 @@
 
     ValidatorConfig validatorConfig =
         new ValidatorConfig(
-            new FakeConfigFactory(projectName, config), new FakeGroupCacheUUIDByName());
+            new FakeConfigFactory(projectName, config), new FakeGroupByNameFinder());
 
     assertThat(
             validatorConfig.isEnabledForRef(