Search in sources :

Example 1 with Resource

use of io.milton.resource.Resource in project lobcder by skoulouzis.

the class TestUtils method test.

public void test() throws NotAuthorizedException, BadRequestException {
    ColRes col1 = new ColRes("col1");
    ColRes col2 = new ColRes("col2");
    col1.children.put("col2", col2);
    Res page = new Res("page");
    col2.children.put("page", page);
    Path path = Path.path("col2/page");
    Resource r = Utils.findChild(col1, path);
    assertEquals(page, r);
}
Also used : Path(io.milton.common.Path) CollectionResource(io.milton.resource.CollectionResource) Resource(io.milton.resource.Resource)

Example 2 with Resource

use of io.milton.resource.Resource in project lobcder by skoulouzis.

the class PutHandler method processCreate.

private void processCreate(HttpManager manager, Request request, Response response, PutableResource folder, String newName) throws ConflictException, BadRequestException, NotAuthorizedException {
    if (!handlerHelper.checkAuthorisation(manager, folder, request)) {
        responseHandler.respondUnauthorised(folder, response, request);
        return;
    }
    LogUtils.debug(log, "process: putting to: ", folder.getName());
    try {
        Long l = putHelper.getContentLength(request);
        String ct = putHelper.findContentTypes(request, newName);
        LogUtils.debug(log, "PutHandler: creating resource of type: ", ct);
        String redirectUrl = folder.checkRedirect(request);
        if (redirectUrl != null && redirectUrl.length() > 0) {
            responseHandler.respondRedirect(response, request, redirectUrl);
            return;
        // return true;
        }
        Resource newlyCreated = folder.createNew(newName, request.getInputStream(), l, ct);
        if (newlyCreated != null) {
            if (newName != null && !newName.equals(newlyCreated.getName())) {
                log.warn("getName on the created resource does not match the name requested by the client! requested: " + newName + " - created: " + newlyCreated.getName());
            }
            manager.getEventManager().fireEvent(new PutEvent(newlyCreated));
            manager.getResponseHandler().respondCreated(newlyCreated, response, request);
        } else {
            throw new RuntimeException("createNew method on: " + folder.getClass() + " returned a null resource. Must return a reference to the newly created or modified resource");
        }
    } catch (IOException ex) {
        throw new RuntimeException("IOException reading input stream. Probably interrupted upload", ex);
    }
}
Also used : PutEvent(io.milton.event.PutEvent) PutableResource(io.milton.resource.PutableResource) ReplaceableResource(io.milton.resource.ReplaceableResource) Resource(io.milton.resource.Resource) GetableResource(io.milton.resource.GetableResource) MakeCollectionableResource(io.milton.resource.MakeCollectionableResource) CollectionResource(io.milton.resource.CollectionResource) IOException(java.io.IOException)

Example 3 with Resource

use of io.milton.resource.Resource in project lobcder by skoulouzis.

the class PutHandler method process.

@Override
public void process(HttpManager manager, Request request, Response response) throws NotAuthorizedException, ConflictException, BadRequestException, NotFoundException {
    if (!handlerHelper.checkExpects(responseHandler, request, response)) {
        return;
    }
    String host = request.getHostHeader();
    String urlToCreateOrUpdate = HttpManager.decodeUrl(request.getAbsolutePath());
    LogUtils.debug(log, "PUT request. Host:", host, " Url:", urlToCreateOrUpdate, " content length header:", request.getContentLengthHeader());
    Path path = Path.path(urlToCreateOrUpdate);
    urlToCreateOrUpdate = path.toString();
    Resource existingResource = manager.getResourceFactory().getResource(host, urlToCreateOrUpdate);
    StorageErrorReason storageErr = null;
    if (existingResource != null) {
        // Make sure the parent collection is not locked by someone else
        if (handlerHelper.isLockedOut(request, existingResource)) {
            log.warn("resource is locked, but not by the current user");
            String value = request.getIfHeader();
            if (value != null) {
                response.setStatus(Status.SC_PRECONDITION_FAILED);
                return;
            } else {
                respondLocked(request, response, existingResource);
                return;
            }
        }
        // Check if the resource has been modified based on etags
        if (!matchHelper.checkIfMatch(existingResource, request)) {
            log.info("if-match comparison failed, aborting PUT request");
            responseHandler.respondPreconditionFailed(request, response, existingResource);
            return;
        }
        if (matchHelper.checkIfNoneMatch(existingResource, request)) {
            log.info("if-none-match comparison failed, aborting PUT request");
            responseHandler.respondPreconditionFailed(request, response, existingResource);
            return;
        }
        Resource parent = manager.getResourceFactory().getResource(host, path.getParent().toString());
        // }
        if (parent instanceof CollectionResource) {
            CollectionResource parentCol = (CollectionResource) parent;
            storageErr = handlerHelper.checkStorageOnReplace(request, parentCol, existingResource, host);
        } else {
            log.warn("parent exists but is not a collection resource: " + path.getParent());
        }
    } else {
        if (!matchHelper.checkIfMatch(null, request)) {
            log.info("if-match comparison failed on null resource, aborting PUT request");
            responseHandler.respondPreconditionFailed(request, response, existingResource);
            return;
        }
        if (matchHelper.checkIfNoneMatch(null, request)) {
            log.info("if-none-match comparison failed on null resource, aborting PUT request");
            responseHandler.respondPreconditionFailed(request, response, existingResource);
            return;
        }
        CollectionResource parentCol = putHelper.findNearestParent(manager, host, path);
        storageErr = handlerHelper.checkStorageOnAdd(request, parentCol, path.getParent(), host);
    }
    if (storageErr != null) {
        respondInsufficientStorage(request, response, storageErr);
        return;
    }
    ReplaceableResource replacee;
    if (existingResource != null && existingResource instanceof ReplaceableResource) {
        replacee = (ReplaceableResource) existingResource;
    } else {
        replacee = null;
    }
    if (replacee != null) {
        if (log.isTraceEnabled()) {
            log.trace("replacing content in: " + replacee.getName() + " - " + replacee.getClass());
        }
        long t = System.currentTimeMillis();
        try {
            manager.onProcessResourceStart(request, response, replacee);
            processReplace(manager, request, response, replacee);
            manager.getEventManager().fireEvent(new PutEvent(replacee));
        } finally {
            t = System.currentTimeMillis() - t;
            manager.onProcessResourceFinish(request, response, replacee, t);
        }
    } else {
        // either no existing resource, or its not replaceable. check for folder
        String nameToCreate = path.getName();
        CollectionResource folderResource = findOrCreateFolders(manager, host, path.getParent(), request);
        if (folderResource != null) {
            long t = System.currentTimeMillis();
            try {
                if (folderResource instanceof PutableResource) {
                    // Make sure the parent collection is not locked by someone else
                    if (handlerHelper.isLockedOut(request, folderResource)) {
                        respondLocked(request, response, folderResource);
                        return;
                    }
                    PutableResource putableResource = (PutableResource) folderResource;
                    processCreate(manager, request, response, putableResource, nameToCreate);
                } else {
                    LogUtils.debug(log, "method not implemented: PUT on class: ", folderResource.getClass(), folderResource.getName());
                    manager.getResponseHandler().respondMethodNotImplemented(folderResource, response, request);
                }
            } finally {
                t = System.currentTimeMillis() - t;
                manager.onProcessResourceFinish(request, response, folderResource, t);
            }
        } else {
            responseHandler.respondNotFound(response, request);
        }
    }
}
Also used : Path(io.milton.common.Path) CollectionResource(io.milton.resource.CollectionResource) StorageErrorReason(io.milton.http.quota.StorageChecker.StorageErrorReason) PutEvent(io.milton.event.PutEvent) PutableResource(io.milton.resource.PutableResource) ReplaceableResource(io.milton.resource.ReplaceableResource) Resource(io.milton.resource.Resource) GetableResource(io.milton.resource.GetableResource) MakeCollectionableResource(io.milton.resource.MakeCollectionableResource) CollectionResource(io.milton.resource.CollectionResource) PutableResource(io.milton.resource.PutableResource) ReplaceableResource(io.milton.resource.ReplaceableResource)

Example 4 with Resource

use of io.milton.resource.Resource in project lobcder by skoulouzis.

the class PutHandler method processExistingResource.

public void processExistingResource(HttpManager manager, Request request, Response response, Resource resource) throws NotAuthorizedException, BadRequestException, ConflictException, NotFoundException {
    String host = request.getHostHeader();
    String urlToCreateOrUpdate = HttpManager.decodeUrl(request.getAbsolutePath());
    log.debug("process request: host: " + host + " url: " + urlToCreateOrUpdate);
    Path path = Path.path(urlToCreateOrUpdate);
    urlToCreateOrUpdate = path.toString();
    Resource existingResource = manager.getResourceFactory().getResource(host, urlToCreateOrUpdate);
    ReplaceableResource replacee;
    if (existingResource != null) {
        // Make sure the parent collection is not locked by someone else
        if (handlerHelper.isLockedOut(request, existingResource)) {
            log.warn("resource is locked, but not by the current user");
            // 423
            response.setStatus(Status.SC_LOCKED);
            return;
        }
    }
    if (existingResource != null && existingResource instanceof ReplaceableResource) {
        replacee = (ReplaceableResource) existingResource;
    } else {
        replacee = null;
    }
    if (replacee != null) {
        processReplace(manager, request, response, (ReplaceableResource) existingResource);
    } else {
        // either no existing resource, or its not replaceable. check for folder
        String urlFolder = path.getParent().toString();
        String nameToCreate = path.getName();
        CollectionResource folderResource = findOrCreateFolders(manager, host, path.getParent(), request);
        if (folderResource != null) {
            if (log.isDebugEnabled()) {
                log.debug("found folder: " + urlFolder + " - " + folderResource.getClass());
            }
            if (folderResource instanceof PutableResource) {
                // Make sure the parent collection is not locked by someone else
                if (handlerHelper.isLockedOut(request, folderResource)) {
                    // 423
                    response.setStatus(Status.SC_LOCKED);
                    return;
                }
                PutableResource putableResource = (PutableResource) folderResource;
                processCreate(manager, request, response, putableResource, nameToCreate);
            } else {
                responseHandler.respondMethodNotImplemented(folderResource, response, request);
            }
        } else {
            responseHandler.respondNotFound(response, request);
        }
    }
}
Also used : Path(io.milton.common.Path) CollectionResource(io.milton.resource.CollectionResource) PutableResource(io.milton.resource.PutableResource) ReplaceableResource(io.milton.resource.ReplaceableResource) Resource(io.milton.resource.Resource) GetableResource(io.milton.resource.GetableResource) MakeCollectionableResource(io.milton.resource.MakeCollectionableResource) CollectionResource(io.milton.resource.CollectionResource) PutableResource(io.milton.resource.PutableResource) ReplaceableResource(io.milton.resource.ReplaceableResource)

Example 5 with Resource

use of io.milton.resource.Resource in project lobcder by skoulouzis.

the class PutHandler method findOrCreateFolders.

private CollectionResource findOrCreateFolders(HttpManager manager, String host, Path path, Request request) throws NotAuthorizedException, ConflictException, BadRequestException {
    if (path == null) {
        return null;
    }
    Resource thisResource = manager.getResourceFactory().getResource(host, path.toString());
    if (thisResource != null) {
        // return the wrong resource for a given path
        if (thisResource.getName() != null && !thisResource.getName().equals(path.getName())) {
            log.warn("Your resource factory returned a resource with a different name to that requested!!! Requested: " + path.getName() + " returned: " + thisResource.getName() + " - resource factory: " + manager.getResourceFactory().getClass());
        }
        if (thisResource instanceof CollectionResource) {
            return (CollectionResource) thisResource;
        } else {
            log.warn("parent is not a collection: " + path);
            return null;
        }
    }
    CollectionResource parent = findOrCreateFolders(manager, host, path.getParent(), request);
    if (parent == null) {
        log.warn("couldnt find parent: " + path);
    // return null;
    }
    Resource r = parent.child(path.getName());
    if (r == null) {
        log.info("Could not find child: " + path.getName() + " in parent: " + parent.getName() + " - " + parent.getClass());
        if (parent instanceof MakeCollectionableResource) {
            MakeCollectionableResource mkcol = (MakeCollectionableResource) parent;
            if (!handlerHelper.checkAuthorisation(manager, mkcol, request)) {
                throw new NotAuthorizedException(mkcol);
            }
            log.info("autocreating new folder: " + path.getName());
            CollectionResource newCol = mkcol.createCollection(path.getName());
            manager.getEventManager().fireEvent(new NewFolderEvent(newCol));
            return newCol;
        } else {
            log.info("parent folder isnt a MakeCollectionableResource: " + parent.getName() + " - " + parent.getClass());
            return null;
        }
    } else if (r instanceof CollectionResource) {
        return (CollectionResource) r;
    } else {
        log.info("parent in URL is not a collection: " + r.getName());
        return null;
    }
}
Also used : CollectionResource(io.milton.resource.CollectionResource) NewFolderEvent(io.milton.event.NewFolderEvent) PutableResource(io.milton.resource.PutableResource) ReplaceableResource(io.milton.resource.ReplaceableResource) Resource(io.milton.resource.Resource) GetableResource(io.milton.resource.GetableResource) MakeCollectionableResource(io.milton.resource.MakeCollectionableResource) CollectionResource(io.milton.resource.CollectionResource) NotAuthorizedException(io.milton.http.exceptions.NotAuthorizedException) MakeCollectionableResource(io.milton.resource.MakeCollectionableResource)

Aggregations

Resource (io.milton.resource.Resource)37 CollectionResource (io.milton.resource.CollectionResource)23 BadRequestException (io.milton.http.exceptions.BadRequestException)11 NotAuthorizedException (io.milton.http.exceptions.NotAuthorizedException)10 Path (io.milton.common.Path)9 MakeCollectionableResource (io.milton.resource.MakeCollectionableResource)8 PutableResource (io.milton.resource.PutableResource)8 GetableResource (io.milton.resource.GetableResource)7 ConflictException (io.milton.http.exceptions.ConflictException)6 ReplaceableResource (io.milton.resource.ReplaceableResource)6 DeletableResource (io.milton.resource.DeletableResource)5 PostableResource (io.milton.resource.PostableResource)4 IOException (java.io.IOException)4 PutEvent (io.milton.event.PutEvent)3 LockableResource (io.milton.resource.LockableResource)3 PropFindableResource (io.milton.resource.PropFindableResource)3 NewFolderEvent (io.milton.event.NewFolderEvent)2 CopyableResource (io.milton.resource.CopyableResource)2 LockingCollectionResource (io.milton.resource.LockingCollectionResource)2 MoveableResource (io.milton.resource.MoveableResource)2