Index: api/src/main/java/org/hippoecm/frontend/editor/compare/NodeComparer.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- api/src/main/java/org/hippoecm/frontend/editor/compare/NodeComparer.java (revision 56796) +++ api/src/main/java/org/hippoecm/frontend/editor/compare/NodeComparer.java (revision ) @@ -1,5 +1,5 @@ /* - * Copyright 2010-2013 Hippo B.V. (http://www.onehippo.com) + * Copyright 2010-2015 Hippo B.V. (http://www.onehippo.com) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,6 +24,8 @@ import javax.jcr.Value; import org.apache.commons.lang.builder.HashCodeBuilder; +import org.hippoecm.frontend.editor.ITemplateEngine; +import org.hippoecm.frontend.editor.TemplateEngineException; import org.hippoecm.frontend.types.IFieldDescriptor; import org.hippoecm.frontend.types.ITypeDescriptor; import org.slf4j.Logger; @@ -35,11 +37,22 @@ static final Logger log = LoggerFactory.getLogger(NodeComparer.class); + private final ITemplateEngine templateEngine; + + /** + * @deprecated This constructor is deprecated. Please use the constructor with extra parameter templateEngine to + * better support comparison of compounds in compounds. + */ public NodeComparer(ITypeDescriptor type) { + this(type, null); + } + + public NodeComparer(ITypeDescriptor type, ITemplateEngine templateEngine) { super(type); if (!type.isNode()) { - throw new RuntimeException("type does not correspond to a node type"); + throw new RuntimeException("type " + type.getName() + " does not correspond to a node type"); } + this.templateEngine = templateEngine; } public boolean areEqual(Node baseNode, Node targetNode) { @@ -57,7 +70,7 @@ continue; } if (field.getTypeDescriptor().isNode()) { - NodeComparer comparer = new NodeComparer(field.getTypeDescriptor()); + NodeComparer comparer = new NodeComparer(field.getTypeDescriptor(),templateEngine); if (field.isMultiple()) { NodeIterator baseIter = baseNode.getNodes(path); NodeIterator targetIter = targetNode.getNodes(path); @@ -139,14 +152,32 @@ continue; } if (field.getTypeDescriptor().isNode()) { - NodeComparer comparer = new NodeComparer(field.getTypeDescriptor()); + NodeComparer comparer = new NodeComparer(field.getTypeDescriptor(), templateEngine); if (field.isMultiple()) { NodeIterator childIter = node.getNodes(path); while (childIter.hasNext()) { Node child = childIter.nextNode(); hcb.append(child.getName()); + + final String typeName = field.getTypeDescriptor().getName(); + final String childTypeName = child.getPrimaryNodeType().getName(); + if (!typeName.equals(childTypeName)) { + if (templateEngine == null) { + log.warn("Cannot create type specific node comparer because template engine is " + + "not given for field at {}. Descriptor type is {}, node type is {}.", + child.getPath(), typeName, childTypeName); - hcb.append(comparer.getHashCode(child)); - } + hcb.append(comparer.getHashCode(child)); + } + else { + ITypeDescriptor childType = templateEngine.getType(childTypeName); + NodeComparer childComparer = new NodeComparer(childType, templateEngine); + hcb.append(childComparer.getHashCode(child)); + } + } + else { + hcb.append(comparer.getHashCode(child)); + } + } } else { if (node.hasNode(path)) { Node child = node.getNode(path); @@ -169,7 +200,7 @@ } } } - } catch (RepositoryException ex) { + } catch (RepositoryException | TemplateEngineException ex) { log.error(ex.getMessage(), ex); } return hcb.toHashCode(); Index: editor/frontend/src/main/java/org/hippoecm/frontend/editor/plugins/field/AbstractFieldPlugin.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- editor/frontend/src/main/java/org/hippoecm/frontend/editor/plugins/field/AbstractFieldPlugin.java (revision 56796) +++ editor/frontend/src/main/java/org/hippoecm/frontend/editor/plugins/field/AbstractFieldPlugin.java (revision ) @@ -246,7 +246,7 @@ if (field != null) { ITypeDescriptor type = field.getTypeDescriptor(); if (type.isNode()) { - comparer = new NodeComparer(type); + comparer = new NodeComparer(type, helper.getTemplateEngine()); } else { comparer = new ObjectComparer(); }