in src/main/java/org/apache/jackrabbit/ocm/manager/collectionconverter/impl/ResidualNodesCollectionConverterImpl.java [88:131]
protected void doUpdateCollection(Session session, Node parentNode,
CollectionDescriptor collectionDescriptor,
ManageableObjects objects) throws RepositoryException {
String jcrName = getCollectionJcrName(collectionDescriptor);
if (!(objects instanceof ManageableMap)) {
for (NodeIterator ni=parentNode.getNodes(jcrName); ni.hasNext(); ) {
ni.nextNode().remove();
}
return;
}
Map map = (Map) objects.getObjects();
Set updatedItems = new HashSet();
for (Iterator ei=map.entrySet().iterator(); ei.hasNext(); ) {
Map.Entry entry = (Map.Entry) ei.next();
String elementJcrName = String.valueOf(entry.getKey());
Object item = entry.getValue();
// Update existing JCR Nodes
if (parentNode.hasNode(elementJcrName)) {
objectConverter.update(session, parentNode, elementJcrName, item);
}
else {
// Add new collection elements
objectConverter.insert(session, parentNode, elementJcrName, item);
}
updatedItems.add(elementJcrName);
}
// Delete JCR nodes that are not present in the collection
NodeIterator nodeIterator = parentNode.getNodes(jcrName);
List removeNodes = new ArrayList();
while (nodeIterator.hasNext()) {
Node child = nodeIterator.nextNode();
if (!updatedItems.contains(child.getName())) {
removeNodes.add(child);
}
}
for(int i = 0; i < removeNodes.size(); i++) {
((Node) removeNodes.get(i)).remove();
}
}