package org.fenixedu.bennu.io.api;
import javax.ws.rs.Consumes;
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.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import org.fenixedu.bennu.core.groups.Group;
import org.fenixedu.bennu.core.rest.BennuRestResource;
import org.fenixedu.bennu.io.domain.DomainStorage;
import org.fenixedu.bennu.io.domain.FileStorage;
import org.fenixedu.bennu.io.domain.FileSupport;
import org.fenixedu.bennu.io.domain.GenericFile;
import org.fenixedu.bennu.io.domain.LocalFileSystemStorage;
import pt.ist.fenixframework.Atomic;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
@Path("/bennu-io/storage")
public class FileStorageResource extends BennuRestResource {
@POST
@Path("/default/{storage}")
public JsonElement setDefault(@PathParam("storage") String storageId) {
accessControl(Group.managers());
innerSetDefault(this.<FileStorage> readDomainObject(storageId));
return all();
}
@Atomic
private void innerSetDefault(FileStorage storage) {
FileSupport.getInstance().setDefaultStorage(storage);
}
@POST
@Path("/domain/{name}")
@Produces(MediaType.APPLICATION_JSON)
public JsonElement createDomainStorage(@PathParam("name") String name) {
accessControl(Group.managers());
return view(createDomainStorageService(name));
}
@POST
@Path("/lfs")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public JsonElement createLFSStorage(JsonElement json) {
accessControl(Group.managers());
return view(create(json, LocalFileSystemStorage.class));
}
@GET
@Produces(MediaType.APPLICATION_JSON)
public JsonElement all() {
accessControl(Group.managers());
return view(FileSupport.getInstance().getFileStorageSet(), "storages");
}
@GET
@Path("/count")
@Produces(MediaType.APPLICATION_JSON)
public JsonObject fileCount() {
accessControl(Group.managers());
JsonObject json = new JsonObject();
for (FileStorage store : FileSupport.getInstance().getFileStorageSet()) {
json.addProperty(store.getExternalId(), store.getFileSet().size());
}
return json;
}
@Atomic
private DomainStorage createDomainStorageService(String name) {
return FileStorage.createNewDomainStorage(name);
}
@DELETE
@Path("{oid}")
@Produces(MediaType.APPLICATION_JSON)
public JsonElement delete(@PathParam("oid") String storageOid) {
accessControl(Group.managers());
final FileStorage fileStorage = (FileStorage) readDomainObject(storageOid);
final JsonElement response = view(fileStorage);
Boolean deleteStorage = deleteStorage(fileStorage);
if (deleteStorage) {
return response;
}
throw new WebApplicationException(Status.NO_CONTENT);
}
@Atomic
private Boolean deleteStorage(FileStorage fileStorage) {
return fileStorage.delete();
}
@PUT
@Path("/convert/{oid}")
public Response convertFileStorage(@PathParam("oid") String fileStorageOid) {
accessControl(Group.managers());
GenericFile.convertFileStorages((FileStorage) readDomainObject(fileStorageOid));
return ok();
}
}