package org.activityinfo.server.endpoint.rest;
import com.google.appengine.api.datastore.*;
import com.google.common.base.Objects;
import com.google.inject.Inject;
import org.activityinfo.service.DeploymentConfiguration;
import javax.ws.rs.*;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
public class TileResource {
private static final String IMAGE_PROPERTY = "i";
private final String authToken;
private final DatastoreService datastore;
@Inject
public TileResource(DeploymentConfiguration config) {
authToken = config.getProperty("tile.update.key");
datastore = DatastoreServiceFactory.getDatastoreService();
}
@PUT @Path("{layer}/{z}/{x}/{y}.png")
public Response putTile(@HeaderParam("X-Update-Key") String authToken,
@PathParam("layer") String layer,
@PathParam("z") int zoom,
@PathParam("x") int x,
@PathParam("y") int y,
byte[] image) {
if (!Objects.equal(this.authToken, authToken)) {
throw new WebApplicationException(Status.UNAUTHORIZED);
}
Entity entity = new Entity(getKey(layer, zoom, x, y));
entity.setProperty("i", new Blob(image));
datastore.put(entity);
return Response.ok().build();
}
@GET @Path("{layer}/{z}/{x}/{y}.png") @Produces("image/png")
public Response getTile(@PathParam("layer") String layer,
@PathParam("z") int zoom,
@PathParam("x") int x,
@PathParam("y") int y) {
Entity entity;
try {
entity = datastore.get(getKey(layer, zoom, x, y));
} catch (EntityNotFoundException e) {
throw new WebApplicationException(Status.NOT_FOUND);
}
Blob blob = (Blob) entity.getProperty(IMAGE_PROPERTY);
return Response.ok(blob.getBytes()).build();
}
private Key getKey(String layer, int z, int x, int y) {
return KeyFactory.createKey("Tile", layer + "_" + z + "_" + x + "_" + y);
}
}