package com.graphutils.indie.resources;
import com.graphutils.indie.exceptions.MissingNodeException;
import com.graphutils.indie.handlers.BooleanRequestHandler;
import com.graphutils.indie.handlers.RequestHandler;
import com.graphutils.indie.handlers.StreamingRequestHandler;
import com.graphutils.indie.handlers.StringRequestHandler;
import com.sun.jersey.spi.CloseableService;
import org.neo4j.server.database.Database;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.StreamingOutput;
import java.io.IOException;
import java.io.OutputStream;
import static javax.ws.rs.core.Response.Status.*;
public class Resource {
protected Database db;
protected CloseableService closeableService;
protected Response getJson(StringRequestHandler handler) {
try {
return json(handler.handle());
} catch (MissingNodeException ex) {
return missing();
} catch (Exception e) {
e.printStackTrace();
return error();
}
}
protected StreamingOutput getStream(final StreamingRequestHandler handler) {
return new StreamingOutput() {
public void write(OutputStream output) throws IOException, WebApplicationException {
try {
handler.handle(output);
} catch (Exception e) {
e.printStackTrace();
throw new WebApplicationException(e);
} finally {
output.close();
}
}
};
}
protected Response post(RequestHandler handler) {
final CloseableTransaction transaction = new CloseableTransaction(db.graph.beginTx());
closeableService.add(transaction);
try {
handler.handle();
transaction.commit();
return created();
} catch (Exception e) {
e.printStackTrace();
transaction.rollback();
return error();
}
}
protected Response post(BooleanRequestHandler handler) {
return withStatusCode(created(), handler);
}
protected Response delete(BooleanRequestHandler handler) {
return withStatusCode(deleted(), handler);
}
protected Response withStatusCode(Response response, BooleanRequestHandler handler) {
final CloseableTransaction transaction = new CloseableTransaction(db.graph.beginTx());
closeableService.add(transaction);
try {
if (!handler.handle()) {
transaction.rollback();
return error();
}
transaction.commit();
return response;
} catch (Exception e) {
e.printStackTrace();
transaction.rollback();
return error();
}
}
private Response deleted() {
return Response.status(NO_CONTENT).build();
}
private Response missing() {
return Response.status(NOT_FOUND).build();
}
private Response created() {
return Response.status(CREATED).build();
}
private Response error() {
return Response.serverError().build();
}
private Response json(String json) {
return Response.ok(json, MediaType.APPLICATION_JSON_TYPE).build();
}
}