in src/main/java/org/apache/sling/distribution/packaging/impl/ResourceDistributionPackageBuilder.java [190:250]
private Resource uploadStream(ResourceResolver resourceResolver, Resource parent, InputStream stream,
long size, DistributionRequest request) throws PersistenceException {
String name;
log.debug("uploading stream");
if (size == -1) {
// stable id
Map<String, Object> info = new HashMap<String, Object>();
DistributionPackageUtils.readInfo(stream, info);
log.debug("read header {}", info);
Object remoteId = info.get(DistributionPackageUtils.PROPERTY_REMOTE_PACKAGE_ID);
if (remoteId != null) {
name = remoteId.toString();
if (name.contains("/")) {
name = name.substring(name.lastIndexOf('/') + 1);
}
log.debug("preserving remote id {}", name);
} else {
name = "dstrpck-" + System.currentTimeMillis() + "-" + UUID.randomUUID().toString();
log.debug("generating a new id {}", name);
}
} else {
name = "dstrpck-" + System.currentTimeMillis() + "-" + UUID.randomUUID().toString();
}
Map<String, Object> props = new HashMap<String, Object>();
props.put(ResourceResolver.PROPERTY_RESOURCE_TYPE, "sling:Folder");
props.put("type", getType());
if (null != request) {
DistributionPackageInfo info = new DistributionPackageInfo(getType());
DistributionPackageUtils.fillInfo(info, request);
props.put(DistributionPackageInfo.PROPERTY_REQUEST_PATHS, info.getPaths());
props.put(DistributionPackageInfo.PROPERTY_REQUEST_DEEP_PATHS,
info.get(DistributionPackageInfo.PROPERTY_REQUEST_DEEP_PATHS));
}
if (size != -1) {
props.put("size", size);
}
Resource r = resourceResolver.getResource(parent, name);
if (r != null) {
resourceResolver.delete(r);
} else {
// check parent is there at least
Resource parentResource = ResourceUtil.getOrCreateResource(resourceResolver, parent.getPath(), "nt:unstructured",
"nt:unstructured", true);
log.debug("created parent {}", parentResource.getPath());
}
Resource resource = resourceResolver.create(parent, name, props);
try {
DistributionPackageUtils.uploadStream(resource, stream);
} catch (RepositoryException e) {
throw new PersistenceException("cannot upload stream", e);
}
resourceResolver.commit();
return resource;
}