Fix eviction policy for cached rules

Project-specific rules are cached in order to avoid re-reading project
configuration, which can be expensive given inheritance is supported.
This latest aspect, though, was no considered when evicting the caches.
This can lead to the case when the rules are changed in a parent project
but the one inheriting them it is not evicted and, in consequence, keeps
reading an outdated set of rules.

Evict rules cache for every child project when a change is detected in
project configuration. This way, child projects will read, through
inheritance, an up to date set of rules.

Change-Id: I66e8a8610c03805b2c4a6eac1245b4d456a1dfa5
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/ItsRulesProjectCacheRefresher.java b/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/ItsRulesProjectCacheRefresher.java
index cd119a4..4cbd3d2 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/ItsRulesProjectCacheRefresher.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/base/workflow/ItsRulesProjectCacheRefresher.java
@@ -1,22 +1,39 @@
 package com.googlesource.gerrit.plugins.its.base.workflow;
 
+import com.google.gerrit.extensions.api.GerritApi;
+import com.google.gerrit.extensions.common.ProjectInfo;
 import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
+import com.google.gerrit.extensions.restapi.RestApiException;
 import com.google.gerrit.reviewdb.client.RefNames;
 import com.google.inject.Inject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class ItsRulesProjectCacheRefresher implements GitReferenceUpdatedListener {
+  private static final Logger log = LoggerFactory.getLogger(ItsRulesProjectCacheRefresher.class);
 
+  private final GerritApi gApi;
   private final ItsRulesProjectCache itsRuleProjectCache;
 
   @Inject
-  ItsRulesProjectCacheRefresher(ItsRulesProjectCache itsRuleProjectCache) {
+  ItsRulesProjectCacheRefresher(GerritApi gApi, ItsRulesProjectCache itsRuleProjectCache) {
+    this.gApi = gApi;
     this.itsRuleProjectCache = itsRuleProjectCache;
   }
 
   @Override
   public void onGitReferenceUpdated(Event event) {
-    if (event.getRefName().equals(RefNames.REFS_CONFIG)) {
-      itsRuleProjectCache.evict(event.getProjectName());
+    if (!event.getRefName().equals(RefNames.REFS_CONFIG)) {
+      return;
+    }
+    String projectName = event.getProjectName();
+    itsRuleProjectCache.evict(projectName);
+    try {
+      for (ProjectInfo childProject : gApi.projects().name(projectName).children()) {
+        itsRuleProjectCache.evict(childProject.name);
+      }
+    } catch (RestApiException e) {
+      log.warn("Unable to evict ITS rules cache", e);
     }
   }
 }