in src/main/java/org/apache/sling/bundleresource/impl/BundleResource.java [72:166]
public BundleResource(
final ResourceResolver resourceResolver,
final BundleResourceCache cache,
final PathMapping mappedPath,
final String resourcePath,
final Map<String, Object> readProps,
final boolean isFolder) {
this.resourceResolver = resourceResolver;
this.cache = cache;
this.mappedPath = mappedPath;
metadata = new ResourceMetadata();
metadata.setResolutionPath(resourcePath);
metadata.setCreationTime(this.cache.getBundle().getLastModified());
metadata.setModificationTime(this.cache.getBundle().getLastModified());
this.path = resourcePath;
final Map<String, Object> properties = new HashMap<>();
this.valueMap = new ValueMapDecorator(Collections.unmodifiableMap(properties));
if (isFolder) {
properties.put(ResourceResolver.PROPERTY_RESOURCE_TYPE, NT_FOLDER);
} else {
properties.put(ResourceResolver.PROPERTY_RESOURCE_TYPE, NT_FILE);
try {
final URL url = this.cache.getEntry(mappedPath.getEntryPath(resourcePath));
if (url != null) {
metadata.setContentLength(url.openConnection().getContentLength());
}
} catch (final Exception e) {
// don't care, we just have no content length
}
}
Map<String, Map<String, Object>> children = null;
if (readProps != null) {
for (final Map.Entry<String, Object> entry : readProps.entrySet()) {
if (entry.getValue() instanceof Map) {
if (children == null) {
children = new HashMap<>();
}
children.put(entry.getKey(), (Map<String, Object>) entry.getValue());
} else {
properties.put(entry.getKey(), entry.getValue());
}
}
}
if (this.mappedPath.getJSONPropertiesExtension() != null) {
String propsPath =
mappedPath.getEntryPath(resourcePath.concat(this.mappedPath.getJSONPropertiesExtension()));
if (propsPath == null && resourcePath.equals(mappedPath.getResourceRoot())) {
// SLING-10140 - Handle the special case when the resourceRoot points to a file.
// In that case, the JSONProperties sibling entry may still exist
// in the bundle but it would not be contained within the mappedPath set.
// Start with mapped path for the original resource
String entryPath = mappedPath.getEntryPath(resourcePath);
if (entryPath != null) {
// and then add the extension for the candidate sibling path
propsPath = entryPath.concat(this.mappedPath.getJSONPropertiesExtension());
}
}
if (propsPath != null) {
try {
final URL url = this.cache.getEntry(propsPath);
if (url != null) {
final JsonObject obj =
Json.createReader(url.openStream()).readObject();
for (final Map.Entry<String, JsonValue> entry : obj.entrySet()) {
final Object value = getValue(entry.getValue(), true);
if (value != null) {
if (value instanceof Map) {
if (children == null) {
children = new HashMap<>();
}
children.put(entry.getKey(), (Map<String, Object>) value);
} else {
properties.put(entry.getKey(), value);
}
}
}
}
} catch (final IOException ioe) {
log.error("getInputStream: Cannot get input stream for " + propsPath, ioe);
}
}
}
this.subResources = children;
}