in core/src/main/java/org/apache/sling/cms/core/internal/FileMetadataExtractorImpl.java [82:116]
public void updateMetadata(File file, boolean persist) throws IOException {
log.trace("Updating metadata for {}, persist {}", file, persist);
try {
Resource resource = file.getResource();
Resource content = resource.getChild(JcrConstants.JCR_CONTENT);
if (content == null) {
log.warn("Content resource is null");
return;
}
Map<String, Object> properties = null;
Resource metadata = content.getChild(CMSConstants.NN_METADATA);
if (metadata != null) {
properties = metadata.adaptTo(ModifiableValueMap.class);
} else {
properties = new HashMap<>();
properties.put(JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_UNSTRUCTURED);
}
if (properties != null) {
properties.putAll(extractMetadata(file.getResource()));
properties.put("SHA256", generateSha(resource));
resource.getResourceResolver().refresh();
if (metadata == null) {
resource.getResourceResolver().create(content, CMSConstants.NN_METADATA, properties);
}
if (persist) {
resource.getResourceResolver().commit();
}
log.info("Metadata extracted from {}", resource.getPath());
} else {
throw new IOException("Unable to update metadata for " + resource.getPath());
}
} catch (SAXException | TikaException | RepositoryException | LoginException e) {
throw new IOException("Failed to parse metadata", e);
}
}