in src/main/java/org/apache/sling/jcr/contentloader/internal/BundleContentLoader.java [373:442]
private void installFromPath(final Bundle bundle, final String path, final PathEntry configuration,
final Node parent, final List<String> createdNodes, final DefaultContentCreator contentCreator)
throws RepositoryException, ContentReaderUnavailableException {
// init content creator
contentCreator.init(configuration, getContentReaders(), createdNodes, null);
final Map<String, Node> processedEntries = new HashMap<>();
Enumeration<String> entries = bundle.getEntryPaths(path);
if (entries == null) {
// check for single content
final URL u = bundle.getEntry(path);
if (u == null) {
log.info("install: No initial content entries at {} in bundle {}", path, bundle.getSymbolicName());
return;
}
// we have a single file content -> this should replace the target node fully, i.e. parent is one level above
handleFile(path, bundle, processedEntries, configuration, parent.getParent(), createdNodes, contentCreator);
return;
}
// potential parent node import/extension
URL parentNodeDescriptor = importParentNode(bundle, path, parent, contentCreator);
if (parentNodeDescriptor != null) {
processedEntries.put(parentNodeDescriptor.toString(), parent);
}
while (entries.hasMoreElements()) {
final String entry = entries.nextElement();
log.debug("Processing initial content entry {} in bundle {}", entry, bundle.getSymbolicName());
if (entry.endsWith("/")) {
// dir, check for node descriptor, else create dir
final String base = entry.substring(0, entry.length() - 1);
URL nodeDescriptor = null;
for (String ext : contentCreator.getContentReaders().keySet()) {
nodeDescriptor = bundle.getEntry(base + ext);
if (nodeDescriptor != null) {
break;
}
}
// if we have a descriptor, which has not been processed yet,
// otherwise call createFolder, which creates an nt:folder or
// returns an existing node (created by a descriptor)
final String name = getName(base);
Node node = null;
if (nodeDescriptor != null) {
node = processedEntries.get(nodeDescriptor.toString());
if (node == null) {
node = createNode(parent, name, nodeDescriptor, contentCreator, configuration);
processedEntries.put(nodeDescriptor.toString(), node);
}
} else {
node = createFolder(parent, name, configuration.isOverwrite());
}
// walk down the line
if (node != null) {
installFromPath(bundle, entry, configuration, node, createdNodes, contentCreator);
}
} else {
// file => create file
handleFile(entry, bundle, processedEntries, configuration, parent, createdNodes, contentCreator);
}
}
}