in src/main/java/org/apache/sling/jcr/contentloader/internal/DefaultContentCreator.java [536:588]
private void resolveReferences(Node node) throws RepositoryException {
List<String> props = delayedReferences.remove(node.getPath());
if (props == null || props.isEmpty()) {
return;
}
// check whether we can set at all
if (!node.isNodeType("mix:referenceable")) {
return;
}
Session session = node.getSession();
String uuid = node.getIdentifier();
for (String property : props) {
String name = getName(property);
Node parentNode = getParentNode(session, property);
if (parentNode != null) {
checkoutIfNecessary(parentNode);
if (parentNode.hasProperty(name) && parentNode.getProperty(name).getDefinition().isMultiple()) {
boolean hasAll = true;
String[] uuidOrPaths = delayedMultipleReferences.get(property);
String[] uuids = new String[uuidOrPaths.length];
for (int i = 0; i < uuidOrPaths.length; i++) {
// is the reference still a path
if (uuidOrPaths[i].startsWith("/")) {
if (uuidOrPaths[i].equals(node.getPath())) {
uuidOrPaths[i] = uuid;
uuids[i] = uuid;
} else {
uuids[i] = null;
hasAll = false;
}
} else {
uuids[i] = uuidOrPaths[i];
}
}
parentNode.setProperty(name, uuids, PropertyType.REFERENCE);
if (this.importListener != null) {
this.importListener.onCreate(parentNode.getProperty(name).getPath());
}
if (hasAll) {
delayedMultipleReferences.remove(property);
}
} else {
parentNode.setProperty(name, uuid, PropertyType.REFERENCE);
if (this.importListener != null) {
this.importListener.onCreate(parentNode.getProperty(name).getPath());
}
}
}
}
}