package org.oregami.resources;
import org.apache.log4j.Logger;
import org.oregami.data.GenericDAOUUIDImpl;
import org.oregami.data.RevisionInfo;
import org.oregami.entities.BaseEntityUUID;
import org.oregami.entities.user.User;
import org.oregami.service.ServiceCallContext;
import org.oregami.service.ServiceResult;
import org.oregami.service.TopLevelEntityService;
import javax.persistence.OptimisticLockException;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriBuilder;
import java.net.URI;
import java.util.List;
import java.util.NoSuchElementException;
/**
* Created by sebastian on 18.03.15.
*/
public abstract class ResourceHelper {
public static Response create(User user, BaseEntityUUID entity, TopLevelEntityService service, Class resourceClass) {
try {
ServiceCallContext context = new ServiceCallContext(user);
ServiceResult<BaseEntityUUID> serviceResult = service.createNewEntity(entity, context);
if (serviceResult.hasErrors()) {
return Response.status(Response.Status.BAD_REQUEST)
.type("text/json")
.entity(serviceResult.getErrors()).build();
}
//BUG: https://java.net/jira/browse/JERSEY-2838
// and https://github.com/dropwizard/dropwizard/issues/878
//return Response.created(new URI(serviceResult.getResult().getId())).build();
//workaround:
final URI uri = UriBuilder.fromResource(resourceClass)
.path("{id}")
.build(serviceResult.getResult().getId());
return Response.created(uri).build();
} catch (Exception e) {
return Response.status(Response.Status.CONFLICT).type("text/plain")
.entity(e.getMessage()).build();
}
}
public static Response update(User user, String id, BaseEntityUUID entity, TopLevelEntityService service) {
if (entity.getId() == null) {
return Response.status(Response.Status.BAD_REQUEST).build();
}
try {
ServiceCallContext context = new ServiceCallContext(user);
ServiceResult<BaseEntityUUID> serviceResult = service.updateEntity(entity, context);
if (serviceResult.hasErrors()) {
return Response.status(Response.Status.BAD_REQUEST)
.type("text/json")
.entity(serviceResult.getErrors()).build();
}
} catch (OptimisticLockException e) {
Logger.getLogger(ResourceHelper.class).warn("OptimisticLockException", e);
return Response.status(Response.Status.BAD_REQUEST).tag("OptimisticLockException").build();
}
return Response.status(Response.Status.ACCEPTED).entity(entity).build();
}
public static Response getRevision(String id, String revision, GenericDAOUUIDImpl dao) {
BaseEntityUUID entity = dao.findRevision(id, Integer.parseInt(revision));
if (entity != null) {
return Response.ok(entity).build();
} else {
return Response.status(Response.Status.NOT_FOUND).build();
}
}
public static Response getRevisions(String id, GenericDAOUUIDImpl dao) {
List<RevisionInfo> revisionList = dao.findRevisions(id);
if (revisionList != null) {
return Response.ok(revisionList).build();
} else {
return Response.status(Response.Status.NOT_FOUND).build();
}
}
public static Response get(String id, GenericDAOUUIDImpl dao) {
BaseEntityUUID entity = dao.findOne(id);
if (entity != null) {
return Response.ok(entity).build();
} else {
return Response.status(Response.Status.NOT_FOUND).build();
}
}
public static Response delete(User user, String id, TopLevelEntityService service) {
try {
service.deleteEntity(id);
} catch (NoSuchElementException e) {
return Response.status(Response.Status.NOT_FOUND).build();
}
return Response.ok().build();
}
}