一种方法是使用相同的模板创建一个新页面,然后遍历节点列表并计算组件的哈希值(或它们的内容,具体取决于您想要比较的内容)。获得空页面模板的哈希后,您就可以将任何其他页面哈希与之进行比较。
注意:此解决方案需要适应您自己的用例。也许您只需检查页面上的哪些组件及其顺序就足够了,也许您还想比较它们的配置。
private boolean areHashesEqual(final Resource copiedPageRes, final Resource currentPageRes) {
final Resource currentRes = currentPageRes.getChild(com.day.cq.commons.jcr.JcrConstants.JCR_CONTENT);
return currentRes != null && ModelUtils.getPageHash(copiedPageRes).equals(ModelUtils.getPageHash(currentRes));
}
模型用途:
public static String getPageHash(final Resource res) {
long pageHash = 0;
final Queue<Resource> components = new ArrayDeque<>();
components.add(res);
while (!components.isEmpty()) {
final Resource currentRes = components.poll();
final Iterable<Resource> children = currentRes.getChildren();
for (final Resource child : children) {
components.add(child);
}
pageHash = ModelUtils.getHash(pageHash, currentRes.getResourceType());
}
return String.valueOf(pageHash);
}
/**
* This method returns product of hashes of all parameters
* @param args
* @return int hash
*/
public static long getHash(final Object... args) {
int result = 0;
for (final Object arg : args) {
if (arg != null) {
result += arg.hashCode();
}
}
return result;
}
注意:使用 Queue 也会考虑组件的顺序。
这是我的方法,但我有一个非常具体的用例。通常,您会想考虑是否真的要计算要发布的每个页面上每个组件的哈希值,因为这会减慢发布过程。您还可以在每次迭代中比较哈希并打破第一个差异的计算。