Search in sources :

Example 96 with Request

use of org.restlet.Request in project qi4j-sdk by Qi4j.

the class ContextResourceClient method delete.

// Delete
public HandlerCommand delete(ResponseHandler responseHandler, ResponseHandler processingErrorHandler) throws ResourceException {
    if (responseHandler == null)
        responseHandler = deleteHandler;
    Request request = new Request(Method.DELETE, new Reference(reference.toUri()).toString());
    contextResourceFactory.updateCommandRequest(request);
    int tries = 3;
    while (true) {
        Response response = new Response(request);
        try {
            contextResourceFactory.getClient().handle(request, response);
            if (!response.getStatus().isSuccess()) {
                return errorHandler.handleResponse(response, this);
            } else {
                // Reset modification date
                contextResourceFactory.updateCache(response);
                return responseHandler.handleResponse(response, this);
            }
        } catch (ResourceException e) {
            if (e.getStatus().equals(Status.CONNECTOR_ERROR_COMMUNICATION) || e.getStatus().equals(Status.CONNECTOR_ERROR_CONNECTION)) {
                if (tries == 0) {
                    // Give up
                    throw e;
                } else {
                    // Try again
                    tries--;
                    continue;
                }
            } else {
                // Abort
                throw e;
            }
        } finally {
            try {
                response.getEntity().exhaust();
            } catch (Throwable e) {
            // Ignore
            }
        }
    }
}
Also used : ChallengeResponse(org.restlet.data.ChallengeResponse) Response(org.restlet.Response) Reference(org.restlet.data.Reference) Request(org.restlet.Request) ResourceException(org.restlet.resource.ResourceException)

Example 97 with Request

use of org.restlet.Request in project qi4j-sdk by Qi4j.

the class ContextResource method handleQuery.

private void handleQuery(String segment) {
    Request request = Request.getCurrent();
    Response response = Response.getCurrent();
    // Query
    // Try to locate either the query method or command method that should be used
    Method queryMethod = resourceMethodQueries.get(segment);
    if (queryMethod == null) {
        queryMethod = resourceMethodCommands.get(segment);
    }
    if (queryMethod == null) {
        // Not found as interaction, try SubResource
        Method resourceMethod = subResources.get(segment);
        if (resourceMethod != null && resourceMethod.getAnnotation(SubResource.class) != null) {
            // Found it! Redirect to it
            response.setStatus(Status.REDIRECTION_FOUND);
            response.setLocationRef(new Reference(request.getResourceRef().toString() + "/").toString());
            return;
        } else {
            // 404
            throw new ResourceException(Status.CLIENT_ERROR_NOT_FOUND);
        }
    }
    // Check if this is a request to show the form for this interaction
    if ((request.getMethod().isSafe() && queryMethod.getParameterTypes().length != 0 && request.getResourceRef().getQuery() == null) || (!request.getMethod().isSafe() && queryMethod.getParameterTypes().length != 0 && !(request.getEntity().isAvailable() || request.getResourceRef().getQuery() != null || queryMethod.getParameterTypes()[0].equals(Response.class)))) {
        // Show form
        try {
            // Tell client to try again
            response.setStatus(Status.CLIENT_ERROR_UNPROCESSABLE_ENTITY);
            response.getAllowedMethods().add(org.restlet.data.Method.GET);
            response.getAllowedMethods().add(org.restlet.data.Method.POST);
            result(formForMethod(queryMethod));
        } catch (Exception e) {
            handleException(response, e);
        }
    } else {
        // Check timestamps
        ResourceValidity validity = (ResourceValidity) request.getAttributes().get(RESOURCE_VALIDITY);
        if (validity != null) {
            validity.checkRequest();
        }
        // Check method constraints
        if (!constraints.isValid(queryMethod, current(), module)) {
            throw new ResourceException(Status.CLIENT_ERROR_NOT_FOUND);
        }
        try {
            // Create argument
            Object[] arguments;
            if (queryMethod.getParameterTypes().length > 0) {
                try {
                    arguments = requestReader.readRequest(Request.getCurrent(), queryMethod);
                    if (arguments == null) {
                        // Show form
                        result(formForMethod(queryMethod));
                        return;
                    }
                } catch (IllegalArgumentException e) {
                    // Still missing some values - show form
                    result(formForMethod(queryMethod));
                    return;
                }
            } else {
                // No arguments to this query
                arguments = new Object[0];
            }
            // Invoke method
            Request.getCurrent().getAttributes().put(ARGUMENTS, arguments);
            Object result = queryMethod.invoke(this, arguments);
            if (result != null) {
                if (result instanceof Representation) {
                    response.setEntity((Representation) result);
                } else {
                    result(convert(result));
                }
            }
        } catch (Throwable e) {
            handleException(response, e);
        }
    }
}
Also used : Response(org.restlet.Response) Reference(org.restlet.data.Reference) Request(org.restlet.Request) ResourceException(org.restlet.resource.ResourceException) EmptyRepresentation(org.restlet.representation.EmptyRepresentation) StringRepresentation(org.restlet.representation.StringRepresentation) Representation(org.restlet.representation.Representation) Method(java.lang.reflect.Method) EntityTypeNotFoundException(org.qi4j.api.unitofwork.EntityTypeNotFoundException) ResourceException(org.restlet.resource.ResourceException) InvocationTargetException(java.lang.reflect.InvocationTargetException) UnsupportedEncodingException(java.io.UnsupportedEncodingException) NoSuchEntityException(org.qi4j.api.unitofwork.NoSuchEntityException) ConstraintViolationException(org.qi4j.api.constraint.ConstraintViolationException)

Example 98 with Request

use of org.restlet.Request in project qi4j-sdk by Qi4j.

the class ContextResource method setResourceValidity.

// API methods
protected void setResourceValidity(EntityComposite entity) {
    Request request = Request.getCurrent();
    ResourceValidity validity = new ResourceValidity(entity, spi, request);
    request.getAttributes().put(RESOURCE_VALIDITY, validity);
}
Also used : Request(org.restlet.Request)

Example 99 with Request

use of org.restlet.Request in project qi4j-sdk by Qi4j.

the class ContextResource method resource.

private void resource() {
    Request request = Request.getCurrent();
    Response response = Response.getCurrent();
    if (!request.getMethod().equals(org.restlet.data.Method.GET)) {
        response.setStatus(Status.CLIENT_ERROR_METHOD_NOT_ALLOWED);
        return;
    }
    ObjectSelection objectSelection = current();
    // Check for interaction->method mappings
    if (ResourceDelete.class.isAssignableFrom(getClass())) {
        response.getAllowedMethods().add(org.restlet.data.Method.DELETE);
    }
    if (ResourceUpdate.class.isAssignableFrom(getClass())) {
        response.getAllowedMethods().add(org.restlet.data.Method.PUT);
    }
    // Construct resource
    ValueBuilder<Resource> builder = module.newValueBuilder(Resource.class);
    List<Link> queriesProperty = builder.prototype().queries().get();
    for (Method query : resourceQueries) {
        if (constraints.isValid(query, objectSelection, module)) {
            ValueBuilder<Link> linkBuilder = module.newValueBuilder(Link.class);
            Link prototype = linkBuilder.prototype();
            prototype.classes().set("query");
            prototype.text().set(humanReadable(query.getName()));
            prototype.href().set(query.getName().toLowerCase());
            prototype.rel().set(query.getName().toLowerCase());
            prototype.id().set(query.getName().toLowerCase());
            queriesProperty.add(linkBuilder.newInstance());
        }
    }
    List<Link> commandsProperty = builder.prototype().commands().get();
    for (Method command : resourceCommands) {
        if (constraints.isValid(command, objectSelection, module)) {
            ValueBuilder<Link> linkBuilder = module.newValueBuilder(Link.class);
            Link prototype = linkBuilder.prototype();
            prototype.classes().set("command");
            prototype.text().set(humanReadable(command.getName()));
            prototype.href().set(command.getName().toLowerCase());
            prototype.rel().set(command.getName().toLowerCase());
            prototype.id().set(command.getName().toLowerCase());
            commandsProperty.add(linkBuilder.newInstance());
        }
    }
    List<Link> resourcesProperty = builder.prototype().resources().get();
    for (Method subResource : subResources.values()) {
        if (constraints.isValid(subResource, objectSelection, module)) {
            ValueBuilder<Link> linkBuilder = module.newValueBuilder(Link.class);
            Link prototype = linkBuilder.prototype();
            prototype.classes().set("resource");
            prototype.text().set(humanReadable(subResource.getName()));
            prototype.href().set(subResource.getName().toLowerCase() + "/");
            prototype.rel().set(subResource.getName().toLowerCase());
            prototype.id().set(subResource.getName().toLowerCase());
            resourcesProperty.add(linkBuilder.newInstance());
        }
    }
    try {
        Method indexMethod = resourceMethodQueries.get("index");
        if (indexMethod != null) {
            Object index = convert(indexMethod.invoke(this));
            if (index != null && index instanceof ValueComposite) {
                builder.prototype().index().set((ValueComposite) index);
            }
        }
    } catch (Throwable e) {
    // Ignore
    }
    try {
        responseWriter.writeResponse(builder.newInstance(), response);
    } catch (Throwable e) {
        handleException(response, e);
    }
}
Also used : Response(org.restlet.Response) Request(org.restlet.Request) Resource(org.qi4j.library.rest.common.Resource) Method(java.lang.reflect.Method) ValueComposite(org.qi4j.api.value.ValueComposite) Link(org.qi4j.library.rest.common.link.Link)

Example 100 with Request

use of org.restlet.Request in project qi4j-sdk by Qi4j.

the class ContextResource method handleCommand.

private void handleCommand(String segment) {
    Request request = Request.getCurrent();
    Response response = Response.getCurrent();
    // Check if this is a request to show the form for this command
    Method interactionMethod = resourceMethodCommands.get(segment);
    if (shouldShowCommandForm(interactionMethod)) {
        // Show form
        // TODO This should check if method is idempotent
        response.getAllowedMethods().add(org.restlet.data.Method.POST);
        try {
            // Check if there is a query with this name - if so invoke it
            Method queryMethod = resourceMethodQueries.get(segment);
            if (queryMethod != null) {
                result(queryMethod.invoke(this));
            } else {
                request.setMethod(org.restlet.data.Method.POST);
                response.setStatus(Status.CLIENT_ERROR_UNPROCESSABLE_ENTITY);
                result(formForMethod(interactionMethod));
            }
        } catch (Exception e) {
            handleException(response, e);
        }
    } else {
        // Check timestamps
        ResourceValidity validity = (ResourceValidity) request.getAttributes().get(RESOURCE_VALIDITY);
        if (validity != null) {
            validity.checkRequest();
        }
        // Check method constraints
        if (!constraints.isValid(interactionMethod, current(), module)) {
            throw new ResourceException(Status.CLIENT_ERROR_NOT_FOUND);
        }
        // Create argument
        Object[] arguments = requestReader.readRequest(Request.getCurrent(), interactionMethod);
        Request.getCurrent().getAttributes().put(ARGUMENTS, arguments);
        // Invoke method
        try {
            Object result = interactionMethod.invoke(this, arguments);
            if (result != null) {
                if (result instanceof Representation) {
                    response.setEntity((Representation) result);
                } else {
                    result(convert(result));
                }
            }
        } catch (Throwable e) {
            handleException(response, e);
        }
    }
}
Also used : Response(org.restlet.Response) Request(org.restlet.Request) ResourceException(org.restlet.resource.ResourceException) EmptyRepresentation(org.restlet.representation.EmptyRepresentation) StringRepresentation(org.restlet.representation.StringRepresentation) Representation(org.restlet.representation.Representation) Method(java.lang.reflect.Method) EntityTypeNotFoundException(org.qi4j.api.unitofwork.EntityTypeNotFoundException) ResourceException(org.restlet.resource.ResourceException) InvocationTargetException(java.lang.reflect.InvocationTargetException) UnsupportedEncodingException(java.io.UnsupportedEncodingException) NoSuchEntityException(org.qi4j.api.unitofwork.NoSuchEntityException) ConstraintViolationException(org.qi4j.api.constraint.ConstraintViolationException)

Aggregations

Request (org.restlet.Request)100 Response (org.restlet.Response)64 Test (org.testng.annotations.Test)38 OAuth2Request (org.forgerock.oauth2.core.OAuth2Request)37 Reference (org.restlet.data.Reference)26 Representation (org.restlet.representation.Representation)24 ChallengeResponse (org.restlet.data.ChallengeResponse)18 StringWriter (java.io.StringWriter)15 Status (org.restlet.data.Status)15 HttpServletRequest (javax.servlet.http.HttpServletRequest)13 HashMap (java.util.HashMap)12 ZNRecord (org.apache.helix.ZNRecord)11 AccessToken (org.forgerock.oauth2.core.AccessToken)11 AccessTokenVerifier (org.forgerock.oauth2.core.AccessTokenVerifier)11 StringReader (java.io.StringReader)10 TypeReference (org.codehaus.jackson.type.TypeReference)10 ObjectMapper (org.codehaus.jackson.map.ObjectMapper)9 Form (org.restlet.data.Form)9 OAuth2ProviderSettings (org.forgerock.oauth2.core.OAuth2ProviderSettings)8 BeforeMethod (org.testng.annotations.BeforeMethod)8