protected final void doRun()

in src/main/java/org/apache/sling/servlets/post/impl/operations/AbstractCopyMoveOperation.java [41:139]


    protected final void doRun(final SlingHttpServletRequest request,
            final PostResponse response,
            final List<Modification> changes)
    throws PersistenceException {
        final VersioningConfiguration versioningConfiguration = getVersioningConfiguration(request);

        final Resource resource = request.getResource();
        final String source = resource.getPath();

        // ensure dest is not empty/null and is absolute
        String dest = request.getParameter(SlingPostConstants.RP_DEST);
        if (dest == null || dest.length() == 0) {
            throw new IllegalArgumentException("Unable to process "
                    + getOperationName() + ". Missing destination");
        }

        // register whether the path ends with a trailing slash
        final boolean trailingSlash = dest.endsWith("/");

        // ensure destination is an absolute and normalized path
        if (!dest.startsWith("/")) {
            dest = ResourceUtil.getParent(source) + "/" + dest;
        }
        dest = ResourceUtil.normalize(dest);

        // destination parent and name
        final String dstParent = trailingSlash ? dest : ResourceUtil.getParent(dest);

        // delete destination if already exists
        if (!trailingSlash && request.getResourceResolver().getResource(dest) != null ) {

            final String replaceString = request.getParameter(SlingPostConstants.RP_REPLACE);
            final boolean isReplace = "true".equalsIgnoreCase(replaceString);
            if (!isReplace) {
                response.setStatus(HttpServletResponse.SC_PRECONDITION_FAILED,
                    "Cannot " + getOperationName() + " " + resource + " to "
                        + dest + ": destination exists");
                return;
            } else {
                this.jcrSupport.checkoutIfNecessary(request.getResourceResolver().getResource(dstParent),
                        changes, versioningConfiguration);
            }

        } else {

            // check if path to destination exists and create it, but only
            // if it's a descendant of the current node
            if (!dstParent.equals("")) {
                final Resource parentResource = request.getResourceResolver().getResource(dstParent);
                if (parentResource != null ) {
                    this.jcrSupport.checkoutIfNecessary(parentResource, changes, versioningConfiguration);
                } else {
                    response.setStatus(HttpServletResponse.SC_PRECONDITION_FAILED,
                        "Cannot " + getOperationName() + " " + resource + " to "
                            + dest + ": parent of destination does not exist");
                    return;
                }
            }

            // the destination is newly created, hence a create request
            response.setCreateRequest(true);
        }

        final Iterator<Resource> resources = getApplyToResources(request);
        final Resource destResource;
        if (resources == null) {

            final String dstName = trailingSlash ? null : ResourceUtil.getName(dest);
            destResource = execute(changes, resource, dstParent, dstName, versioningConfiguration);

        } else {

            // multiple applyTo requires trailing slash on destination
            if (!trailingSlash) {
                throw new IllegalArgumentException(
                    "Applying "
                        + getOperationName()
                        + " to multiple resources requires a trailing slash on the destination");
            }

            // multiple copy will never return 201/CREATED
            response.setCreateRequest(false);

            while (resources.hasNext()) {
                final Resource applyTo = resources.next();
                execute(changes, applyTo, dstParent, null, versioningConfiguration);
            }
            destResource = request.getResourceResolver().getResource(dest);

        }

        if ( destResource == null ) {
            response.setStatus(HttpServletResponse.SC_NOT_FOUND,
                    "Missing source " + resource + " for " + getOperationName());
            return;
        }
        // finally apply the ordering parameter
        this.orderResource(request, destResource, changes);
    }