package io.github.ibuildthecloud.gdapi.request.handler;
import io.github.ibuildthecloud.gdapi.model.ListOptions;
import io.github.ibuildthecloud.gdapi.model.Schema.Method;
import io.github.ibuildthecloud.gdapi.request.ApiRequest;
import io.github.ibuildthecloud.gdapi.request.resource.ResourceManager;
import io.github.ibuildthecloud.gdapi.request.resource.ResourceManagerLocator;
import io.github.ibuildthecloud.gdapi.util.ResponseCodes;
import java.io.IOException;
import javax.inject.Inject;
import javax.servlet.ServletException;
public class ResourceManagerRequestHandler extends AbstractResponseGenerator {
ResourceManagerLocator resourceManagerLocator;
@Override
protected void generate(ApiRequest request) throws IOException {
ResourceManager manager = resourceManagerLocator.getResourceManager(request);
if (manager == null) {
return;
}
/*
* Note at this point we can assume type is not null because if type is null the manager will not be found
*/
Object response = null;
String method = request.getMethod();
if (Method.POST.isMethod(method)) {
if (request.getAction() == null) {
/*
* Optimistically set response code to created. The ResourceManager impl should set the code to ACCEPTED if a background task was created. On
* error and exception should be thrown and then the response code will be changed to an error code
*/
request.setResponseCode(ResponseCodes.CREATED);
response = manager.create(request.getType(), request);
} else if (request.getId() == null) {
response = manager.collectionAction(request.getType(), request);
} else {
response = manager.resourceAction(request.getType(), request);
}
} else if (Method.PUT.isMethod(method)) {
response = manager.update(request.getType(), request.getId(), request);
} else if (Method.GET.isMethod(method)) {
if (request.getId() != null && request.getLink() == null) {
response = manager.getById(request.getType(), request.getId(), new ListOptions(request));
} else if (request.getType() != null && request.getLink() != null) {
response = manager.getLink(request.getType(), request.getId(), request.getLink(), request);
} else if (request.getType() != null) {
response = manager.list(request.getType(), request);
}
} else if (Method.DELETE.isMethod(method)) {
response = manager.delete(request.getType(), request.getId(), request);
}
request.setResponseObject(response);
}
@Override
public boolean handleException(ApiRequest request, Throwable e) throws IOException, ServletException {
ResourceManager manager = resourceManagerLocator.getResourceManager(request);
if (manager == null) {
return super.handleException(request, e);
}
return manager.handleException(e, request);
}
public ResourceManagerLocator getResourceManagerLocator() {
return resourceManagerLocator;
}
@Inject
public void setResourceManagerLocator(ResourceManagerLocator resourceManagerLocator) {
this.resourceManagerLocator = resourceManagerLocator;
}
}