Search in sources :

Example 1 with TransferStreamingOutput

use of org.commonjava.indy.core.bind.jaxrs.util.TransferStreamingOutput in project indy by Commonjava.

the class ContentAccessHandler method doGet.

public Response doGet(final String packageType, final String type, final String name, final String path, final String baseUri, final HttpServletRequest request, EventMetadata eventMetadata, final Consumer<ResponseBuilder> builderModifier) {
    if (!PackageTypes.contains(packageType)) {
        ResponseBuilder builder = Response.status(400);
        if (builderModifier != null) {
            builderModifier.accept(builder);
        }
        return builder.build();
    }
    final StoreType st = StoreType.get(type);
    final StoreKey sk = new StoreKey(packageType, st, name);
    eventMetadata = eventMetadata.set(ContentManager.ENTRY_POINT_STORE, sk);
    final AcceptInfo acceptInfo = jaxRsRequestHelper.findAccept(request, ApplicationContent.text_html);
    final String standardAccept = ApplicationContent.getStandardAccept(acceptInfo.getBaseAccept());
    Response response = null;
    logger.info("GET path: '{}' (RAW: '{}')\nIn store: '{}'\nUser addMetadata header is: '{}'\nStandard addMetadata header for that is: '{}'", path, request.getPathInfo(), sk, acceptInfo.getRawAccept(), standardAccept);
    if (path == null || path.equals("") || request.getPathInfo().endsWith("/") || path.endsWith(LISTING_HTML_FILE)) {
        try {
            logger.info("Getting listing at: {}", path);
            final String content = contentController.renderListing(standardAccept, st, name, path, baseUri, uriFormatter);
            response = formatOkResponseWithEntity(content, acceptInfo.getRawAccept(), builderModifier);
        } catch (final IndyWorkflowException e) {
            logger.error(String.format("Failed to render content listing: %s from: %s. Reason: %s", path, name, e.getMessage()), e);
            response = formatResponse(e, builderModifier);
        }
    } else {
        try {
            logger.info("START: retrieval of content: {}:{}", sk, path);
            final Transfer item = contentController.get(sk, path, eventMetadata);
            logger.info("HANDLE: retrieval of content: {}:{}", sk, path);
            if (item == null) {
                return handleMissingContentQuery(sk, path, builderModifier);
            }
            boolean handleLocking = false;
            if (!item.isWriteLocked()) {
                item.lockWrite();
                handleLocking = true;
            }
            try {
                if (!item.exists()) {
                    return handleMissingContentQuery(sk, path, builderModifier);
                } else if (item.isDirectory()) {
                    try {
                        logger.info("Getting listing at: {}", path + "/");
                        final String content = contentController.renderListing(standardAccept, st, name, path + "/", baseUri, uriFormatter);
                        response = formatOkResponseWithEntity(content, acceptInfo.getRawAccept(), builderModifier);
                    } catch (final IndyWorkflowException e) {
                        logger.error(String.format("Failed to render content listing: %s from: %s. Reason: %s", path, name, e.getMessage()), e);
                        response = formatResponse(e, builderModifier);
                    }
                } else {
                    logger.info("RETURNING: retrieval of content: {}:{}", sk, path);
                    // open the stream here to prevent deletion while waiting for the transfer back to the user to start...
                    InputStream in = item.openInputStream(true, eventMetadata);
                    final ResponseBuilder builder = Response.ok(new TransferStreamingOutput(in));
                    setInfoHeaders(builder, item, sk, path, true, contentController.getContentType(path), contentController.getHttpMetadata(item));
                    if (builderModifier != null) {
                        builderModifier.accept(builder);
                    }
                    response = builder.build();
                }
            } finally {
                if (handleLocking) {
                    item.unlock();
                }
            }
        } catch (final IOException | IndyWorkflowException e) {
            logger.error(String.format("Failed to download artifact: %s from: %s. Reason: %s", path, name, e.getMessage()), e);
            response = formatResponse(e, builderModifier);
        }
    }
    logger.info("RETURNING RESULT: {}:{}", sk, path);
    return response;
}
Also used : InputStream(java.io.InputStream) TransferStreamingOutput(org.commonjava.indy.core.bind.jaxrs.util.TransferStreamingOutput) IOException(java.io.IOException) StoreKey(org.commonjava.indy.model.core.StoreKey) StoreType(org.commonjava.indy.model.core.StoreType) ResponseUtils.formatResponse(org.commonjava.indy.bind.jaxrs.util.ResponseUtils.formatResponse) Response(javax.ws.rs.core.Response) IndyWorkflowException(org.commonjava.indy.IndyWorkflowException) Transfer(org.commonjava.maven.galley.model.Transfer) ResponseBuilder(javax.ws.rs.core.Response.ResponseBuilder) AcceptInfo(org.commonjava.indy.util.AcceptInfo)

Aggregations

IOException (java.io.IOException)1 InputStream (java.io.InputStream)1 Response (javax.ws.rs.core.Response)1 ResponseBuilder (javax.ws.rs.core.Response.ResponseBuilder)1 IndyWorkflowException (org.commonjava.indy.IndyWorkflowException)1 ResponseUtils.formatResponse (org.commonjava.indy.bind.jaxrs.util.ResponseUtils.formatResponse)1 TransferStreamingOutput (org.commonjava.indy.core.bind.jaxrs.util.TransferStreamingOutput)1 StoreKey (org.commonjava.indy.model.core.StoreKey)1 StoreType (org.commonjava.indy.model.core.StoreType)1 AcceptInfo (org.commonjava.indy.util.AcceptInfo)1 Transfer (org.commonjava.maven.galley.model.Transfer)1