Adapt to changes in gerrit core

Remove the deprecated ChangeAttributeFactory after it was deleted with
change https://gerrit-review.googlesource.com/c/285979.

Change-Id: I555832317943a9614b64f7851856c7c5fad9e05e
diff --git a/java/com/google/gerrit/plugins/checks/Module.java b/java/com/google/gerrit/plugins/checks/Module.java
index 3431ec1..4787df6 100644
--- a/java/com/google/gerrit/plugins/checks/Module.java
+++ b/java/com/google/gerrit/plugins/checks/Module.java
@@ -31,8 +31,8 @@
 import com.google.gerrit.server.IdentifiedUser;
 import com.google.gerrit.server.ServerInitiated;
 import com.google.gerrit.server.UserInitiated;
-import com.google.gerrit.server.change.ChangeAttributeFactory;
 import com.google.gerrit.server.change.ChangeETagComputation;
+import com.google.gerrit.server.change.ChangePluginDefinedInfoFactory;
 import com.google.gerrit.server.git.validators.CommitValidationListener;
 import com.google.gerrit.server.git.validators.MergeValidationListener;
 import com.google.gerrit.server.git.validators.RefOperationValidationListener;
@@ -67,7 +67,8 @@
         .to(ChecksETagComputation.class)
         .in(SINGLETON);
 
-    DynamicSet.bind(binder(), ChangeAttributeFactory.class).to(ChangeCheckAttributeFactory.class);
+    DynamicSet.bind(binder(), ChangePluginDefinedInfoFactory.class)
+        .to(ChangeCheckAttributeFactory.class);
     bind(DynamicOptions.DynamicBean.class)
         .annotatedWith(Exports.named(GetChange.class))
         .to(GetChangeOptions.class);
diff --git a/java/com/google/gerrit/plugins/checks/api/ChangeCheckAttributeFactory.java b/java/com/google/gerrit/plugins/checks/api/ChangeCheckAttributeFactory.java
index 9c48851..f456279 100644
--- a/java/com/google/gerrit/plugins/checks/api/ChangeCheckAttributeFactory.java
+++ b/java/com/google/gerrit/plugins/checks/api/ChangeCheckAttributeFactory.java
@@ -14,13 +14,22 @@
 
 package com.google.gerrit.plugins.checks.api;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.gerrit.entities.Change;
+import com.google.gerrit.extensions.common.PluginDefinedInfo;
 import com.google.gerrit.plugins.checks.CombinedCheckStateCache;
 import com.google.gerrit.server.DynamicOptions.BeanProvider;
 import com.google.gerrit.server.DynamicOptions.DynamicBean;
-import com.google.gerrit.server.change.ChangeAttributeFactory;
+import com.google.gerrit.server.change.ChangePluginDefinedInfoFactory;
 import com.google.gerrit.server.query.change.ChangeData;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
+import java.util.AbstractMap;
+import java.util.AbstractMap.SimpleImmutableEntry;
+import java.util.Collection;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 import org.kohsuke.args4j.Option;
 
 /**
@@ -28,7 +37,7 @@
  * a {@code ChangeInfo}.
  */
 @Singleton
-public class ChangeCheckAttributeFactory implements ChangeAttributeFactory {
+public class ChangeCheckAttributeFactory implements ChangePluginDefinedInfoFactory {
   private static final String COMBINED_OPTION_NAME = "--combined";
   private static final String COMBINED_OPTION_USAGE = "include combined check state";
 
@@ -50,19 +59,37 @@
   }
 
   @Override
-  public ChangeCheckInfo create(ChangeData cd, BeanProvider beanProvider, String plugin) {
+  public Map<Change.Id, PluginDefinedInfo> createPluginDefinedInfos(
+      Collection<ChangeData> cds, BeanProvider beanProvider, String plugin) {
     DynamicBean opts = beanProvider.getDynamicBean(plugin);
     if (opts == null) {
-      return null;
+      return ImmutableMap.of();
     }
     if (opts instanceof GetChangeOptions) {
-      return forGetChange(cd, (GetChangeOptions) opts);
+      return evalAndCollect(
+          cds,
+          cd ->
+              new AbstractMap.SimpleImmutableEntry<>(
+                  cd.getId(), forGetChange(cd, (GetChangeOptions) opts)));
     } else if (opts instanceof QueryChangesOptions) {
-      return forQueryChanges(cd, (QueryChangesOptions) opts);
+      return evalAndCollect(
+          cds,
+          cd ->
+              new AbstractMap.SimpleImmutableEntry<>(
+                  cd.getId(), forQueryChanges(cd, (QueryChangesOptions) opts)));
     }
     throw new IllegalStateException("unexpected options type: " + opts);
   }
 
+  private Map<Change.Id, PluginDefinedInfo> evalAndCollect(
+      Collection<ChangeData> cds,
+      Function<ChangeData, SimpleImmutableEntry<Change.Id, ChangeCheckInfo>> transformFn) {
+    return cds.stream()
+        .map(transformFn)
+        .filter(e -> e.getKey() != null && e.getValue() != null)
+        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
+  }
+
   private ChangeCheckInfo forGetChange(ChangeData cd, GetChangeOptions opts) {
     if (opts == null || !opts.combined) {
       return null;