package net.wasdev.twelvefactorapp;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.json.Json;
import javax.json.JsonObject;
import javax.json.JsonReader;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import net.wasdev.twelvefactorapp.ResponseHandler.RequestType;
@Path("/")
public class JaxrsHttpReceiver {
String defaultDatabaseName = "items";
public String getDefaultDatabaseName() {
return defaultDatabaseName;
}
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getResponse() throws NullPointerException, IOException {
try {
String dbFiles = getDatabases();
return Response.ok(dbFiles).build();
} catch (Exception e) {
JsonObject exception = Json.createObjectBuilder().add("Exception", e.getMessage()).build();
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(exception).build();
}
}
@Path("/{name}")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getDatabaseResponse(@PathParam("name") String name) {
try {
String database = getDatabaseFiles(name);
return Response.ok(database).build();
} catch (Exception e) {
JsonObject exception = Json.createObjectBuilder().add("Exception", e.getMessage()).build();
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(exception).build();
}
}
public String getDatabases() throws Exception {
System.out.println("Getting all databases");
ResponseHandler responseHandler = new ResponseHandler("/_all_dbs");
String response = responseHandler.invoke(RequestType.GET);
return response;
}
public String getDatabaseFiles(String database) throws Exception {
System.out.println("Getting files for database" + database);
// An example of how to use java.util.logging
Logger myLogger = Logger.getLogger("net.wasdev.12factorapp.JaxrsHttpReceiver.getDatabaseFiles");
myLogger.log(Level.INFO, "Extra logging as an example");
ResponseHandler responseHandler = new ResponseHandler("/" + database + "/_all_docs");
String response = responseHandler.invoke(RequestType.GET);
return response;
}
@POST
@Produces(MediaType.APPLICATION_JSON)
public Response postResponse(String data) throws NullPointerException, IOException {
try {
String contents = storeData(data);
return Response.ok(contents).build();
} catch (Exception e) {
JsonObject exception = Json.createObjectBuilder().add("Exception", e.getMessage()).build();
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(exception).build();
}
}
@Path("/{name}")
@POST
@Produces(MediaType.APPLICATION_JSON)
public Response postDataResponse(String data, @PathParam("name") String name) {
try {
String contents = storeData(data, name);
return Response.ok(contents).build();
} catch (Exception e) {
JsonObject exception = Json.createObjectBuilder().add("Exception", e.getMessage()).build();
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(exception).build();
}
}
public String storeData(String data) throws NullPointerException, IOException, Exception {
return storeData(data, defaultDatabaseName);
}
public String storeData(String data, String database) throws Exception {
System.out.println("Storing data " + data);
// Convert string to jsonObject
InputStream is = new ByteArrayInputStream(data.getBytes());
JsonReader reader = Json.createReader(is);
JsonObject jsonData = reader.readObject();
Entity<myObject> ent = Entity.entity(new myObject(jsonData), MediaType.APPLICATION_JSON);
// Get response
ResponseHandler responseHandler = new ResponseHandler("/" + database + "/");
String response = responseHandler.invoke(RequestType.POST, ent);
return response;
}
@PUT
@Produces(MediaType.APPLICATION_JSON)
public Response putResponse(String databaseName) throws NullPointerException, IOException {
System.out.println("Creating database called " + databaseName);
String response;
try {
ResponseHandler responseHandler = new ResponseHandler("/" + databaseName);
response = responseHandler.invoke(RequestType.PUT);
return Response.ok("Created database " + response).build();
} catch (Exception e) {
JsonObject exception = Json.createObjectBuilder().add("Exception", e.getMessage()).build();
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(exception).build();
}
}
@Path("/{name}")
@DELETE
@Produces(MediaType.APPLICATION_JSON)
public Response deleteResponse(@PathParam("name") String name) {
System.out.println("Deleting database called " + name);
String response;
try {
ResponseHandler responseHandler = new ResponseHandler("/" + name);
response = responseHandler.invoke(RequestType.DELETE);
return Response.ok("Deleted database " + response).build();
} catch (Exception e) {
JsonObject exception = Json.createObjectBuilder().add("Exception", e.getMessage()).build();
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(exception).build();
}
}
}