Reload documents if meta data of any parent project is changed
Meta data changes in a parent project may affect the rendering of
documents. Hence documents should be reloaded if there was a change in
the refs/meta/config branch of any parent project. To achieve this a
hash computed out of the revision IDs of the refs/meta/config branches
of all parent project is included into the document cache key. As
result there is no cache hit when the meta data of a parent project
was changed and the document is reloaded.
This will also enable the implementation of inheritable CSS.
Change-Id: I9dabffabc8a003ef42a21e280eeba355462c2a8a
Signed-off-by: Edwin Kempin <edwin.kempin@sap.com>
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocCache.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocCache.java
index 013a1c5..3d1226f 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocCache.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocCache.java
@@ -15,6 +15,8 @@
package com.googlesource.gerrit.plugins.xdocs;
import com.google.common.cache.LoadingCache;
+import com.google.common.hash.Hasher;
+import com.google.common.hash.Hashing;
import com.google.gerrit.httpd.resources.Resource;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.project.ProjectCache;
@@ -48,6 +50,21 @@
? p.getConfig().getRevision()
: ObjectId.zeroId();
return cache.getUnchecked((new XDocResourceKey(formatter.getName(),
- project, file, revId, metaConfigRevId)).asString());
+ project, file, revId, metaConfigRevId, getParentsHash(project)))
+ .asString());
+ }
+
+ private String getParentsHash(Project.NameKey project) {
+ Hasher h = Hashing.md5().newHasher();
+ ProjectState p = projectCache.get(project);
+ if (p != null) {
+ for (ProjectState parent : p.parents()) {
+ h.putUnencodedChars(
+ parent.getConfig().getRevision() != null
+ ? parent.getConfig().getRevision().getName()
+ : ObjectId.zeroId().getName());
+ }
+ }
+ return h.hash().toString();
}
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocResourceKey.java b/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocResourceKey.java
index 5bae456..178eea2 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocResourceKey.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/xdocs/XDocResourceKey.java
@@ -14,6 +14,7 @@
package com.googlesource.gerrit.plugins.xdocs;
+import com.google.common.base.Strings;
import com.google.gerrit.extensions.restapi.IdString;
import com.google.gerrit.reviewdb.client.Project;
@@ -27,14 +28,16 @@
private final String resource;
private final ObjectId revId;
private final ObjectId metaConfigRevId;
+ private final String parentsHash;
XDocResourceKey(String formatter, Project.NameKey project, String r,
- ObjectId revId, ObjectId metaConfigRevId) {
+ ObjectId revId, ObjectId metaConfigRevId, String parentsHash) {
this.formatter = formatter;
this.project = project;
this.resource = r;
this.revId = revId;
this.metaConfigRevId = metaConfigRevId;
+ this.parentsHash = parentsHash;
}
public String getFormatter() {
@@ -55,7 +58,8 @@
@Override
public int hashCode() {
- return Objects.hash(formatter, project, resource, revId, metaConfigRevId);
+ return Objects.hash(formatter, project, resource, revId, metaConfigRevId,
+ parentsHash);
}
@Override
@@ -66,7 +70,8 @@
&& Objects.equals(project, rk.project)
&& Objects.equals(resource, rk.resource)
&& Objects.equals(revId, rk.revId)
- && Objects.equals(metaConfigRevId, rk.metaConfigRevId);
+ && Objects.equals(metaConfigRevId, rk.metaConfigRevId)
+ && Objects.equals(parentsHash, rk.parentsHash);
}
return false;
}
@@ -82,6 +87,8 @@
b.append(revId != null ? revId.name() : "");
b.append("/");
b.append(metaConfigRevId != null ? metaConfigRevId.name() : "");
+ b.append("/");
+ b.append(Strings.nullToEmpty(parentsHash));
return b.toString();
}
@@ -92,6 +99,7 @@
String file = null;
String revision = null;
String metaConfigRevision = null;
+ String parentsHash = null;
if (s.length > 0) {
formatter = IdString.fromUrl(s[0]).get();
}
@@ -107,8 +115,11 @@
if (s.length > 4) {
metaConfigRevision = s[4];
}
+ if (s.length > 5) {
+ parentsHash = s[5];
+ }
return new XDocResourceKey(formatter, new Project.NameKey(project), file,
- toObjectId(revision), toObjectId(metaConfigRevision));
+ toObjectId(revision), toObjectId(metaConfigRevision), parentsHash);
}
private static ObjectId toObjectId(String id) {