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