private Resource uploadStream()

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;
    }